當前位置:成語大全網 - 書法字典 - 引用和引用隊列本質的源代碼分析

引用和引用隊列本質的源代碼分析

每個引用狀態列表都是Active、Pending、Enqueued和Inactive(本文也將基於以下四種狀態進行源代碼解釋)。

狀態之間的主要標識:

它由引用的成員變量queue和next標識(類似於單個鏈表中的next)。

有了這些約束,GC只需要檢測下壹個字段就可以知道引用對象是否需要特殊處理。

什麽特殊待遇?

當GC發送活動狀態的變更時,會將weakReference中的引用設置為null,忽略PhantomReference中的引用(PhantomReference的get方法被重寫為返回null,這可能是它沒有設置為null的原因),並將this和pending賦給next。別問我為什麽,這是有分寸的。。。。這是訓練的水平)

描述:

處於活動狀態的引用會被GC特殊處理,GC會在發現對象的可達性變得合適後改變引用狀態,是掛起還是不活動取決於隊列是否註冊。

特點:

源代碼分析:

描述:

待定引用列表中的引用都處於這種狀態。

它們正在等待內部線程ReferenceHandler處理(調用ReferenceQueue.enqueue方法)。

未註冊的實例不會進入這種狀態!

特點:

源代碼分析:

3.我好像明白ReferenceQueue.ENQUEUED的意思了。

描述:

調用ReferenceQueue.enqueued方法後的引用就處於這種狀態。

未註冊的實例不會進入這種狀態。

特點:

源代碼分析:

可以看出,整體是壹個先進後出的堆棧結構。Head作為棧頭。R.next指向成員變量head,如果head為null,則指向自身(為了給後面的棧找元素)。

描述:

最終狀態,這個狀態下的引用對象,不會改變。

有兩種方法可以達到這種狀態:

1.referenceQueue調用reallyPoll,

2.當referenceQueue未註冊且引用狀態更改時。

特點:

源代碼分析:

引用:

/blog/2015/09/27/Java-weakhashmap/# % E5 % BC % b 1% E5 % BC % 95% E7 % 94% A8 % EF % BC % 88弱引用%EF%BC%89