如何测试一个ThreadLocal是否已经被初始化而没有实际执行?
我想测试一个ThreadLocal
是否已经初始化而没有实际初始化它。 当然,代码需要是线程安全的。 理想情况下,我想要这样的东西:
class TestableThreadLocal<T> extends ThreadLocal<T> {
public boolean isInitialized() {
...
}
}
但是,我将如何实现这种方法?
编辑:动机:我已经subclassed一个ThreadLocal
覆盖initialValue()
。 但是,我并不总是需要初始化,特别是因为它可能导致多类加载器环境中的内存泄漏。 一个简单的测试将帮助我编写代码以避免意外初始化。
我倾向于使用简单的规则来避免类加载器泄漏,虽然它们很麻烦,但是有些包装并没有那么糟糕。 是的,泄漏是邪恶的。
initialValue
,永远 - 你只是要求麻烦,只是忘记它存在。 threadLocal.set(xxx); try{...process...}finally{threadLocal.set(null);}
threadLocal.set(xxx); try{...process...}finally{threadLocal.set(null);}
threadLocal.remove()
而不是threadLocal.set(null)
WeakReferene
(即ThreadLocal <WeakReference<Foo>>
)作为保留硬引用的池中的值。 它可能看起来不符合直觉,但是一旦池被清除,值就消失,并且类可以自由地GC'd 我意识到这个帖子并不是对你的问题的直接回复,但是没有简单的方法来实现你的愿望,并防止泄漏。
思考:
ThreadLocal.get
,则会初始化该值。 get
,而不是initialValue
。 ThreadLocal
而不是遏制? 执行此操作的几种可能方法之一涉及反射,因为ThreadLocal没有可让您知道该值是否已初始化的API。
当然可以使用反射来“编码”它。 然而,所有通常的警告适用。 您的反射代码将高度依赖java.lang.ThreadLocal及其非公共成员的实现细节。 当JDK供应商更改实现时,代码将会中断。
链接地址: http://www.djcxy.com/p/19907.html上一篇: How to test if a ThreadLocal has been initialized without actually doing that?