在Java中,WeakReference用于表示一個對象,該對象只能在其引用被垃圾回收器回收時才能被訪問。WeakReference常用于實現緩存等場景,以避免內存泄漏。要使用WeakReference,你需要創建一個WeakReference對象,并將需要引用的對象作為參數傳遞給它。下面是一個簡單的示例:
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
Object obj = new Object();
WeakReference<Object> weakReference = new WeakReference<>(obj, referenceQueue);
System.out.println("Before garbage collection: " + weakReference.get());
obj = null; // 取消強引用
System.gc(); // 提示垃圾回收器進行垃圾回收
try {
Reference<?> ref = referenceQueue.remove(); // 從隊列中獲取被回收的引用
if (ref == weakReference) {
System.out.println("Object has been garbage collected.");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在這個示例中,我們創建了一個名為obj
的新對象,并將其傳遞給WeakReference
構造函數。我們還創建了一個ReferenceQueue
對象,以便在對象被回收時接收通知。
在將對象傳遞給WeakReference
之后,我們仍然可以通過調用weakReference.get()
來訪問它。但是,當我們取消對obj
的強引用并提示垃圾回收器進行垃圾回收后,weakReference.get()
將返回null,因為對象已經被回收。
需要注意的是,WeakReference并不能保證對象一定會被回收,這取決于垃圾回收器的運行時機。因此,在使用WeakReference時,你需要確保在訪問對象之前檢查它是否為null。