gpt4 book ai didi

java - 如何在不实际执行的情况下测试 ThreadLocal 是否已初始化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:37 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

  • 不要覆盖initialValue , ever - 你只是在自找麻烦,忘记它的存在吧。
  • 不要在 ThreadLocal 中存储非系统/非引导类,除非你这样做 threadLocal.set(xxx); try{...process...}finally{threadLocal.set(null);}
  • 如果您仍然覆盖 initialValue,请使用 threadLocal.remove()不是 threadLocal.set(null)
  • 或使用 WeakReferene (即 ThreadLocal <WeakReference<Foo>> )用于保留硬引用的池中的值。它可能看起来违反直觉,但是一旦池被清除,值就会消失,类可以自由地被 GC

我知道这篇文章并不是对您问题的直接答复,但是没有简单的方法可以实现您的愿望并防止泄漏。

关于java - 如何在不实际执行的情况下测试 ThreadLocal 是否已初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com