Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ประเภทของ Reference ใน Java: Strong, Weak, Soft, Phantom

Java มี reference 4 ระดับ ต่างกันในวิธีที่ Garbage Collector จัดการ:

1. Strong Reference (ปกติ)

ค่า default ของ reference ทุกตัว อ็อบเจกต์ที่มี strong reference อยู่ ไม่ถูก GC จนกว่าจะตัด reference ออก (set null)

class Demo { /* ... */ }

public class DemoExample {
    public static void main(String[] args) {
        Demo myInst = new Demo(); // strong reference
        myInst = null; // ตอนนี้อาจถูก GC ได้
    }
}

2. Weak Reference

ไม่ใช่ default ต้องระบุชัดเจน ใช้กับ WeakHashMap GC จะเก็บอ็อบเจกต์ที่มีแค่ weak reference ไปทันทีในรอบ GC ถัดไป สร้างด้วย java.lang.ref.WeakReference

import java.lang.ref.WeakReference;

class Demo {
    public void displayMsg() { System.out.println("Hello"); }
}

public class DemoSample {
    public static void main(String[] args) {
        Demo inst = new Demo();
        inst.displayMsg();
        
        WeakReference myWeakRef = new WeakReference<>(inst);
        inst = null; // ตัด strong reference
        
        // อาจยังได้อ็อบเจกต์กลับมาถ้า GC ยังไม่ทำงาน
        inst = myWeakRef.get();
        if (inst != null) inst.displayMsg();
    }
}

ผลลัพธ์

Hello
Hello

3. Soft Reference

คงอ็อบเจกต์ไว้นานกว่า weak reference GC จะเก็บก็ต่อเมื่อ หน่วยความจำใกล้จะหมด เหมาะสำหรับแคช

4. Phantom Reference

อ่อนที่สุด get() คืนค่า null เสมอ ใช้ร่วม ReferenceQueue เพื่อรับแจ้งเมื่ออ็อบเจกต์จะถูกทำลายจริงๆ สำหรับ cleanup

สรุปลำดับความแข็งแกร่ง

Strong > Soft > Weak > Phantom

GC จะเก็บตามลำดับ: Phantom ก่อน → Weak → Soft → Strong (ไม่เก็บ)