我有一个Spring应用程序,它将我的业务逻辑方法创建为bean。
我的代码如下:
public class MyClass {
private ThreadLocal<String> object1 = new ThreadLocal<String>();
public String myMethodFoo(MyTestObject testobject) {
object1.set("Blah");
...
...
...
return object1.get();
}
}
现在,当我运行调用此方法的单元测试时,我总是在设置变量值的行上得到空指针异常,即object1.set("Blah")
。
但是当我将ThreadLocal对象声明为final时,它会以某种方式神奇地消失。是否必须将ThreadLocal对象声明为final?
答案 0 :(得分:1)
不,ThreadLocal
不必定义为final
(与此处适用的其他变量规则相同)并且其他一些线程可能正在更改object1
变量到null
。
然而,ThreadLocal
variables should be declared static
因为:
此类提供线程局部变量。这些变量不同 来自他们的正常对应者,每个访问一个的线程 (通过其get或set方法)有自己的,独立初始化 变量的副本。
ThreadLocal
个实例通常是私有的 希望将状态与线程关联的类中的静态字段 (例如,用户ID或交易ID)。