Я смотрел исходный код WeakHashMap
и наткнулся на это:
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
/* snip */
}
}
}
Почему этот метод синхронизируется с ReferenceQueue
? WeakHashMap
сам не претендует на то, чтобы быть потокобезопасным:
Как и большинство классов коллекций, этот класс не синхронизирован. синхронизированный WeakHashMap может быть построен с использованием Метод Collections.synchronizedMap.
Это заставило меня поверить, что эта деталь реализации должна каким-то образом обеспечить безопасность потока самого ReferenceQueue
(так как GC будет модифицировать его из собственного Thread
). Однако документация для ReferenceQueue
ничего не упоминает о каких-либо проблемах concurrency и взгляните на исходный код для ReferenceQueue
показывает, что он даже не синхронизируется сам по себе (он использует внутренний замок).
Почему WeakHashMap
синхронизируется на ReferenceQueue
? Должен ли я синхронизироваться на ReferenceQueue
каждый раз, когда я его использую?