ソースコードを調べていて、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 がそれ自体からそれを変更するためThread
)。ただし、のドキュメントでReferenceQueue
は、同時実行に関する問題については何も言及されておらず、ソース コードを調べてみると、ReferenceQueue
それ自体で同期さえしていない (内部ロックを使用している) ことがわかります。
WeakHashMap
で同期するのはなぜReferenceQueue
ですか? ReferenceQueue
使用するたびに同期する必要がありますか?