ThreadLocal变量始终为null

时间:2017-06-06 21:39:59

标签: java thread-safety

我有一个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?

1 个答案:

答案 0 :(得分:1)

不,ThreadLocal不必定义为final(与此处适用的其他变量规则相同)并且其他一些线程可能正在更改object1变量到null

然而,ThreadLocal variables should be declared static因为:

  

此类提供线程局部变量。这些变量不同   来自他们的正常对应者,每个访问一个的线程   (通过其get或set方法)有自己的,独立初始化   变量的副本。 ThreadLocal个实例通常是私有的   希望将状态与线程关联的类中的静态字段   (例如,用户ID或交易ID)。