一、什麼是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/zh-tw/n/325386.html
微信掃一掃
支付寶掃一掃