【发布时间】:2020-06-22 14:07:54
【问题描述】:
WeakHashMap 与WeakReference 和ReferenceQueue 的作用非常相似——这方面的新闻为零。以下是它应该如何工作的精简示例:
public class ReferenceQueuePlayground {
public static void main(String[] args) {
ReferenceQueue<Referent> q = new ReferenceQueue<>();
Referent ref = new Referent();
WeakReference<Referent> weak = new WeakReference<>(ref, q);
ref = null;
// wait for GC to reclaim Referent
while (weak.get() != null) {
System.gc();
}
// this might return null, because ReferenceQueue is notified asynchronously
// but I am assuming the happy path here
Reference<? extends Referent> reference = q.poll();
// this will be false
System.out.println(reference == null);
// this will be true
System.out.println(reference.get() == null);
}
@RequiredArgsConstructor
@Getter
static class Referent {
}
}
这正是WeakHashMap 的工作原理——当referent 被回收并且reference 被放在ReferenceQueue 上时,它会收到通知。在后续的一些操作中,会调用expungeStaleEntries,它基本上会从这个ReferenceQueue中一个一个地取出元素并作用于它们。
我遇到的问题:如果referent 现在消失了,它如何“对他们采取行动”?毕竟这是...HASHMap,所以要移除元素,它必须知道它是hashCode。你怎么知道hashCode 的东西现在已经消失了?
【问题讨论】:
标签: java garbage-collection weak-references weakhashmap