java – 应该在ReferenceQueue上同步吗?
我正在看看WeakHashMap的源代码,偶然发现:
private final ReferenceQueue<Object> queue = new ReferenceQueue<>(); private void expungeStaleEntries() { for (Object x; (x = queue.poll()) != null; ) { synchronized (queue) { /* snip */ } } } 为什么这个方法在ReferenceQueue上同步?
这使我相信这个实现细节是以某种方式确保ReferenceQueue本身的线程安全性(因为GC将从自己的Thread修改它).然而,the documentation for 为什么WeakHashMap在ReferenceQueue上同步?每次使用ReferenceQueue时,应该同步吗? 解决方法
如果您查看
ReferenceQueue ,您会看到它明确支持平台内的线程,因为它指出,在新的条目可用之前,remove()方法将被阻塞.
在WeakHashMap中看到的同步是确保访问ReferenceQueue的多个线程正确同步. 你可能会发现这个相关的bug at bugs.sun.com有趣. 为了回答你的问题,如果你确保它只被单个线程访问,我认为ReferenceQueue的外部同步是不必要的.我不会使用(并且不能想到一个很好的理由)使用单个ReferenceQueue作为消费者从多个线程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |