如何测试ThreadLocal是否已初始化而没有实际执行此操作?

Chr*_*rle 6 java multithreading thread-safety

我想测试一个ThreadLocal是否已经初始化而没有实际初始化它.当然,代码需要是线程安全的.理想情况下我想要这样的东西:

class TestableThreadLocal<T> extends ThreadLocal<T> {
    public boolean isInitialized() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我该如何实现这种方法呢?

编辑:动机:我有一个子类ThreadLocal来覆盖initialValue().但是,我并不总是需要初始化,特别是因为它可能会导致多类加载器环境中的内存泄漏.一个简单的测试可以帮助我编写代码以避免意外初始化.

bes*_*sss 11

我倾向于使用简单的规则来避免类加载器泄漏,不可否认它们很麻烦,但有一些包装并没有那么糟糕.是的,泄漏是邪恶的.

  • initialValue永远不要覆盖- 你只是在寻找麻烦,只是忘记它存在.
  • 除非你这样做,否则不要在ThreadLocal中存储非系统/非bootstap类 threadLocal.set(xxx); try{...process...}finally{threadLocal.set(null);}
  • 如果仍然覆盖initialValue,请threadLocal.remove()不要使用threadLocal.set(null)
  • 或者使用WeakReferene(即ThreadLocal <WeakReference<Foo>>)来保存硬引用的池中的值.它可能看起来很直观但是一旦清除了池,值就会消失,并且类可以自由地进行GC

我发现帖子不是对你的问题的直接回复,但是没有简单的方法可以达到你想要的目的并防止泄密.