Java中的引用隊列(Reference Queue)是Java提供的一個特殊的數(shù)據(jù)結(jié)構(gòu),它用于存儲被GC回收的對象的引用。當(dāng)一個對象被回收時,其引用會被放入引用隊列,同時我們可以通過引用隊列獲取這些被回收的對象的引用,從而對其進行一些后續(xù)操作。
除了普通的引用之外,Java還提供了一種特殊的引用類型,即弱引用(Weak Reference)。與普通的引用不同,弱引用并不會阻止其所引用的對象被GC回收,當(dāng)被引用的對象被回收時,弱引用也會被自動清除。
下面是一個使用引用隊列和弱引用的案例:
import java.lang.ref.WeakReference; import java.lang.ref.ReferenceQueue; public class ReferenceQueueDemo { public static void main(String[] args) { Object obj = new Object(); ReferenceQueue<Object> queue = new ReferenceQueue<>(); WeakReference<Object> ref = new WeakReference<>(obj, queue); obj = null; // 手動清除強引用 System.gc(); // 手動觸發(fā)GC try { Object refObj = queue.remove(); // 獲取被回收的對象的引用 System.out.println("被回收的對象為:" + refObj); } catch (InterruptedException e) { e.printStackTrace(); } } }
在這個案例中,我們創(chuàng)建了一個新的Object實例,并將其強引用存儲在obj變量中。接下來,我們創(chuàng)建一個ReferenceQueue實例,并使用WeakReference創(chuàng)建一個指向obj的弱引用。手動清除obj的強引用,然后手動觸發(fā)GC,這會導(dǎo)致obj被回收。最后,我們通過ReferenceQueue獲取被回收的對象的引用,并打印出來。
這個案例展示了如何使用Java的引用隊列和弱引用來跟蹤被GC回收的對象。如果我們不使用引用隊列和弱引用,可能無法及時知道對象何時被回收,進而無法進行相關(guān)的后續(xù)操作。