在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。