一直没看到基于弱引用(java.lang.ref.WeakReference)的合适的例子,直到阅读Lucene-core的代码,发现了这么一段:
public class CloseableThreadLocal<T> implements Closeable {
private ThreadLocal<WeakReference<T>> t = new ThreadLocal<WeakReference<T>>();
// Use a WeakHashMap so that if a Thread exits and is
// GC'able, its entry may be removed:
private Map<Thread,T> hardRefs = new WeakHashMap<Thread,T>();
// Increase this to decrease frequency of purging in get:
private static int PURGE_MULTIPLIER = 20;
// On each get or set we decrement this; when it hits 0 we
// purge. After purge, we set this to
// PURGE_MULTIPLIER * stillAliveCount. This keeps
// amortized cost of purging linear.
private final AtomicInteger countUntilPurge = new AtomicInteger(PURGE_MULTIPLIER);
protected T initialValue() {
return null;
}
public T get() {
WeakReference<T> weakRef = t.get();
if (weakRef == null) {
T iv = initialValue();
if (iv != null) {
set(iv);
return iv;
} else {
return null;
}
} else {
maybePurge();
return weakRef.get();
}
}
... ....
这里面用的很好:由于ThreadLocal在使用上并么有数量的限制,需要靠使用者手工删除的方式才能释放对象的引用,因此实际上很容易造成内存泄露,而CloseableThreadLocal使用WeekReference的方式缓存ThreadLocal的数据,很好地解决了这个问题,Perfect!