狀態之間的主要標識:
它由引用的成員變量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