ThreadLocal.Map的key为何要做成weakReference:
1. 当外部tl=null后,只剩key->ThreadLocal对象,故ThreadLocal对象可被回收。因为tl=null,就可以保证不会有“tl.get()”出现,就不会有“Thread.Map.get(this)”出现,故ThreadLocal对象一定是不被外部可见的了,所以可以让它被回收。
如果是普通Map,
Key key = new Key();
map.set(key,value);
key=null; //new Key()这个对象是不会被回收的。因为Map中有refer指向该对象。
2. /** The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table.
ThreadLocal对象被回收后,key->null,此时这个entry可从table中被擦除。?
另外,这是使用WeakReference的例子:
WeakReference<String> wr = new WeakReference<String>(new String("abc"));
System.out.println(wr.get());