我正在看看WeakHashMap的源代码,偶然发现:
private final ReferenceQueue<Object> queue = new ReferenceQueue<>(); private void expungeStaleEntries() { for (Object x; (x = queue.poll()) != null; ) { synchronized (queue) { /* snip */ } } }
为什么这个方法在ReferenceQueue上同步? WeakHashMap
本身并不要求线索安全:
Like most collection classes,this class is not synchronized. A
synchronized WeakHashMap may be constructed using the
Collections.synchronizedMap method.
这使我相信这个实现细节是以某种方式确保ReferenceQueue本身的线程安全性(因为GC将从自己的Thread修改它).然而,the documentation for ReferenceQueue
并没有提到任何并发问题,而是查看ReferenceQueue的源代码,显示它甚至不能自己同步(它使用内部锁).
为什么WeakHashMap在ReferenceQueue上同步?每次使用ReferenceQueue时,应该同步吗?
@H_301_16@解决方法
如果您查看
ReferenceQueue
,您会看到它明确支持平台内的线程,因为它指出,在新的条目可用之前,remove()方法将被阻塞.
在WeakHashMap中看到的同步是确保访问ReferenceQueue的多个线程正确同步.
你可能会发现这个相关的bug at bugs.sun.com有趣.
为了回答你的问题,如果你确保它只被单个线程访问,我认为ReferenceQueue的外部同步是不必要的.我不会使用(并且不能想到一个很好的理由)使用单个ReferenceQueue作为消费者从多个线程.
@H_301_16@ @H_301_16@ 原文链接:https://www.f2er.com/java/125940.html