я invesigate WeakHashMap код Ource иметь больше знаний о WeakReference
Как WeakHashMap работает под капотом
Я обнаружил, что запись выглядит следующим образом:
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
V value;
final int hash;
Entry<K,V> next;
/**
* Creates new entry.
*/
Entry(Object key, V value,
ReferenceQueue<Object> queue,
int hash, Entry<K,V> next) {
super(key, queue);
this.value = value;
this.hash = hash;
this.next = next;
}
...
Таким образом, когда мы создаем новую запись мы вызываем super(key, queue);
. Это WeakReference
конструктор. Насколько я понял, после объект будет собран GC, новая ссылка (я считаю, что это должна быть ссылка на key
) появится в очереди.
Также я заметил метод, который вызывает на каждой операции:
/**
* Expunges stale entries from the table.
*/
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null;) {
synchronized (queue) {
@SuppressWarnings("unchecked")
Entry<K,V> e = (Entry<K,V>) x;
int i = indexFor(e.hash, table.length);
Entry<K,V> prev = table[i];
Entry<K,V> p = prev;
while (p != null) {
Entry<K,V> next = p.next;
if (p == e) {
if (prev == e)
table[i] = next;
else
prev.next = next;
// Must not null out e.next;
// stale entries may be in use by a HashIterator
e.value = null; // Help GC
size--;
break;
}
prev = p;
p = next;
}
}
}
}
Похоже, мы получаем (Entry<K,V>)
из очереди. Я не знаю, как это объяснить (первый вопрос). этот код:
public static void main(String[] args) throws InterruptedException {
StringBuilder AAA = new StringBuilder();
ReferenceQueue queue = new ReferenceQueue();
WeakReference weakRef = new WeakReference(AAA, queue);
AAA = null;
System.gc();
Reference removedReference = queue.remove();
System.out.println(removedReference.get());
}
всегда выдает нуль, поскольку объект уже собранные с помощью ГХ
Кроме того, для меня это было странно, что мы можем иметь ссылку на объект, который уже был собран с помощью ГХ. На самом деле я ожидаю, что ссылка должна появиться в очереди, но я не мог прочитать что-то значимое, потому что объект уже собран (второй вопрос).
@downvoter, я добавил явно текст, который я хочу уточнить – gstackoverflow
рассмотрели ли вы другие вопросы, касающиеся ReferenceQueue? – the8472
@ the8472 Я не видел связанный тег – gstackoverflow