加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 应该在ReferenceQueue上同步吗?

发布时间:2020-12-14 16:17:13 所属栏目:Java 来源:网络整理
导读:我正在看看WeakHashMap的源代码,偶然发现: private final ReferenceQueueObject queue = new ReferenceQueue();private void expungeStaleEntries() { for (Object x; (x = queue.poll()) != null; ) { synchronized (queue) { /* snip */ } }} 为什么这个
我正在看看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时,应该同步吗?

解决方法

如果您查看 ReferenceQueue,您会看到它明确支持平台内的线程,因为它指出,在新的条目可用之前,remove()方法将被阻塞.

在WeakHashMap中看到的同步是确保访问ReferenceQueue的多个线程正确同步.

你可能会发现这个相关的bug at bugs.sun.com有趣.

为了回答你的问题,如果你确保它只被单个线程访问,我认为ReferenceQueue的外部同步是不必要的.我不会使用(并且不能想到一个很好的理由)使用单个ReferenceQueue作为消费者从多个线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读