Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadLocal变量始终为空_Java_Thread Safety - Fatal编程技术网

Java ThreadLocal变量始终为空

Java ThreadLocal变量始终为空,java,thread-safety,Java,Thread Safety,我有一个Spring应用程序,它将我的业务逻辑方法创建为bean 我的代码如下所示: public class MyClass { private ThreadLocal<String> object1 = new ThreadLocal<String>(); public String myMethodFoo(MyTestObject testobject) { object1.set("Blah"); ...

我有一个Spring应用程序,它将我的业务逻辑方法创建为bean

我的代码如下所示:

public class MyClass {
    private ThreadLocal<String> object1 = new ThreadLocal<String>();

    public String myMethodFoo(MyTestObject testobject) { 

        object1.set("Blah");
        ...
        ...
        ...

        return object1.get();
    }

}
公共类MyClass{
private ThreadLocal object1=new ThreadLocal();
公共字符串myMethodFoo(MyTestObject testobject){
反对1.集合(“废话”);
...
...
...
返回object1.get();
}
}
现在,当我运行调用此方法的单元测试时,我总是在设置变量值的行上得到一个空指针异常,即
object1.set(“Blah”)


但不知怎的,当我将ThreadLocal对象声明为final时,它神奇地消失了。ThreadLocal对象是否总是必须声明为final?

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

然而,因为:

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


请提供一个。您的测试是否实际运行多个线程?如果是这样,您将在一个线程中分配给object1,并从多个线程中读取它;这是一场数据竞赛。你需要确保读操作与写操作之间有一个正式的“先发生后发生”关系,我很容易做到这一点,就是把变量设为final。不,我现在只使用单线程来测试它,以了解它是如何工作的。当它仅在单线程应用程序本身中显示空值时,我感到困惑。