Я смотрел исходный код 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 каждый раз, когда я его использую?
