java – 应该在ReferenceQueue上同步吗?

前端之家收集整理的这篇文章主要介绍了java – 应该在ReferenceQueue上同步吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在看看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

猜你在找的Java相关文章