如何测试一个ThreadLocal是否已经被初始化而没有实际执行?

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

class TestableThreadLocal<T> extends ThreadLocal<T> {
    public boolean isInitialized() {
        ...
    }
}

但是,我将如何实现这种方法?

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


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

  • 不要覆盖initialValue ,永远 - 你只是要求麻烦,只是忘记它存在。
  • 不要将非系统/非bootstap类存储在ThreadLocal中,除非您执行threadLocal.set(xxx); try{...process...}finally{threadLocal.set(null);} threadLocal.set(xxx); try{...process...}finally{threadLocal.set(null);}
  • 如果仍然覆盖initialValue,请使用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?

    下一篇: How to interpret profiling results?