弱引用与ThreadLocal的结合
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!
?
?