幕后的Java Cleaner
使用一个双向链表来保存PhantomReference
,直到它们的对象变为幻影可达.当Cleaner
‘S守护程序线程弹出并从其ReferenceQueue
中删除PhantomReference
并将其从列表中删除时,必须锁定整个列表(删除代码为列表上的@synchronized
).
相比之下,ConcurrentHashMap
仍然可以提供对PhantomReference
的O(1)访问,但也可以通过允许多个清理线程同时从映射中删除PhantomReference
(作为键)来支持并发修改.
Java采用双向链表方法有什么原因吗?是不是因为Cleaner
只使用单个守护进程线程进行清理,所以缺乏并发性并不重要?或者,这种 Select 还有更深层次的原因吗?