我正在查看源代码WeakHashMap
并偶然发现:
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
/* snip */
}
}
}
为什么这个方法在 上同步ReferenceQueue
?WeakHashMap
本身并没有声称是线程安全的:
像大多数集合类一样,这个类是不同步的。可以使用 Collections.synchronizedMap 方法构造同步的 WeakHashMap。
这让我相信这个实现细节是为了以某种方式确保ReferenceQueue
自身的线程安全(因为 GC 将从它自己的 GC 中修改它Thread
)。但是,文档ReferenceQueue
没有提到任何关于并发问题的内容,查看源代码ReferenceQueue
会发现它甚至不同步自身(它使用内部锁)。
为什么WeakHashMap
在其上进行同步ReferenceQueue
?ReferenceQueue
我应该在每次使用时同步吗?