Han*_*örr 1 java thread-local resource-leak
天真地,我期望ThreadLocal是某种类型的Thread的WeakHashMap.当我得知ThreadLocal的值实际上保存在Thread中的一个映射中时,我有点困惑.为什么这样做?我希望如果值保存在ThreadLocal本身中,那么与ThreadLocal相关的资源泄漏就不会存在.
澄清:我在考虑类似的事情
public class AlternativeThreadLocal<T> {
private final Map<Thread, T> values =
Collections.synchronizedMap(new WeakHashMap<Thread, T>());
public void set(T value) { values.put(Thread.currentThread(), value); }
public T get() { return values.get(Thread.currentThread());}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这可以防止一个奇怪的问题,即如果值以某种方式强烈引用ThreadLocal本身,那么ThreadLocal和它遗留的值都不会被垃圾收集,直到Thread死掉.(当ThreadLocal是值引用的类上的静态变量时,可能会出现最狡猾的形式.现在,在应用程序服务器的重新部署中存在大量资源泄漏,因为无法收集对象及其类.)
有时你只是问一个问题就能得到启发.:-)现在我刚看到一个可能的答案:线程安全.如果带有值的映射在Thread对象中,则插入新值通常是线程安全的.如果映射在ThreadLocal上,则会出现通常的并发问题,这可能会减慢速度.(当然你会使用ReadWriteLock而不是同步,但问题仍然存在.)
| 归档时间: |
|
| 查看次数: |
3125 次 |
| 最近记录: |