首页 > 解决方案 > 从非声明位置的类访问 Java ThreadLocal 对象

问题描述

我正在声明一个 ThreadLocal 对象并设置一个如下所示的值。

Public Class Blah {

private ThreadLocal<Set<Integer>> numberThreaLocalObj= new ThreadLocal<>();

  void setValue() {
    Set<Integer> numberSet = new HashSet<>();
    numberSet .add(1);
    threaLocalObj.set(numberSet) 
  }
} 

无论如何在同一个线程中的这个类之外引用这个numberThreaLocalObj变量?

我发现一些代码似乎清除了所有线程局部变量,但我只需要根据条件清除这个特定的线程局部变量。

不幸的是,这是一种继承的技术设计。

编辑 - 找到解决方案,如我的回答中所述。

标签: javamultithreadingthreadpoolthread-local

解决方案


它是线程本地的事实是无关紧要的。您在问:我可以从另一个类访问私有字段吗?

答案是:不是。如果您有想要访问此字段的 Blah 实例(它是一个非静态字段;因此,每个 Blah 实例都有一个 threadlocal),您可以使用 java.lang.reflection:

Field f = Blah.class.getDeclaredField("numberThreaLocalObj");
f.setAccessible(true);
ThreadLocal<?> t = f.get(someInstanceOfBlah);
t.set(null);

一旦你添加了适当的异常保护,就会这样做。


推荐阅读