一、什么是WeakReference
1、WeakReference是一种Java中的软引用,用于保持对对象的引用,但是不会阻止它被垃圾回收。
2、WeakReference通常用来实现缓存,在内存不足时自动释放缓存、清理无用的对象;也可以用作监视器,在对象被回收时自动从监视器中删除。
3、WeakReference被封装在java.lang.ref包中,提供了三种引用类型:WeakReference,SoftReference,PhantomReference。
public class MyObject {
...
}
public static void main(String[] args) {
MyObject obj = new MyObject();
WeakReference weakRef = new WeakReference(obj);
...
MyObject newObj = weakRef.get();
if (newObj != null) {
// do something
}
}
二、WeakReference的使用场景
1、缓存数据
WeakReference通常被用来实现缓存,可以将需要缓存的数据存储在一个Map中,使用WeakReference作为Map中的value,保证当内存不足时自动清理无用的对象:
public class Cache {
private Map<String, WeakReference2、观察者模式
WeakReference也可以用于实现观察者模式,当对象被回收时自动从观察者列表中删除:
public interface Observer {
void update();
}
public class Observable {
private List<WeakReference> observers = new ArrayList();
public void addObserver(Observer observer) {
observers.add(new WeakReference(observer));
}
public void removeObserver(Observer observer) {
for (WeakReference ref : observers) {
if (ref.get() == observer) {
observers.remove(ref);
break;
}
}
}
public void notifyObservers() {
for (WeakReference ref : observers) {
Observer observer = ref.get();
if (observer != null) {
observer.update();
}
}
}
}
public static void main(String[] args) {
Observable observable = new Observable();
...
MyObserver myObserver = new MyObserver();
observable.addObserver(myObserver);
// 执行某个操作会触发notifyObservers方法
observable.doSomething();
// MyObserver不再需要被观察,可以自动从观察者列表中删除
myObserver = null;
// 执行垃圾回收
System.gc();
System.runFinalization();
// 再次执行某个操作,不再触发MyObserver的update方法
observable.doSomething();
}
三、WeakReference设计注意事项
1、在使用WeakReference时需要确保弱引用指向的对象不被其他强引用持有,否则会造成对象不被回收的问题。
2、WeakReference在被垃圾回收时会进入队列中,因此如果需要在回收时进行一些额外的操作,可以使用ReferenceQueue。
3、由于WeakReference不会阻止对象被回收,因此当对象被回收后,WeakReference.get()方法将返回null,需要在代码中进行判断处理。
public static void main(String[] args) {
MyObject obj = new MyObject();
ReferenceQueue queue = new ReferenceQueue();
WeakReference ref = new WeakReference(obj, queue);
...
while (true) {
Reference gcRef = queue.poll();
if (gcRef != null) {
// 处理被GC回收的对象
...
}
// do something
}
}
四、WeakReference的优势和劣势
1、优势:
WeakReference可以更加精细地控制内存使用,减小内存泄露的风险。
2、劣势:
WeakReference的使用会带来额外的开销,需要增加代码逻辑和维护成本。
总的来说,WeakReference是一种非常有用的Java技术,在一些场景下可以帮助我们更好地控制内存的使用,但也需要理解其优势和劣势,并合理使用。
原创文章,作者:PVIXD,如若转载,请注明出处:https://www.506064.com/n/325386.html
微信扫一扫
支付宝扫一扫