Java threadlocal是否应声明为最终字段
使用ThreadLocal类编程时,字段是否应声明为final? 如果编写类似于Java threadlocal是否应声明为最终字段,java,multithreading,thread-safety,final,thread-local,Java,Multithreading,Thread Safety,Final,Thread Local,使用ThreadLocal类编程时,字段是否应声明为final? 如果编写类似于private-ThreadLocal-ThreadLocal的代码,然后在构造函数中初始化它,由于变量ThreadLocal引用不能再更改,我猜它等于private-final-ThreadLocal-ThreadLocal这个想法正确吗?在多线程类中,以下方法之间有什么区别 public class ThreadLocalTestForMultiThread{ private ThreadLoc
private-ThreadLocal-ThreadLocal
的代码,然后在构造函数中初始化它,由于变量ThreadLocal引用不能再更改,我猜它等于private-final-ThreadLocal-ThreadLocal
这个想法正确吗?在多线程类中,以下方法之间有什么区别
public class ThreadLocalTestForMultiThread{
private ThreadLocal<String> threadLocal;
public ThreadLocalTestForMultiThread(){
threadLocal = new ThreadLocal<String>();
}
}
public class ThreadLocalTestForMultiThread{
private final ThreadLocal<String> threadLocal;
public ThreadLocalTestForMultiThread(){
threadLocal = new ThreadLocal<String>();
}
}
公共类ThreadLocalTestForMultiThread{
私有线程本地线程本地;
公共线程LocalTestForMultiThread(){
threadLocal=新的threadLocal();
}
}
公共类ThreadLocalTestForMultiThread{
私有最终线程本地线程本地;
公共线程LocalTestForMultiThread(){
threadLocal=新的threadLocal();
}
}
底线是,您不必在ThreadLocal
上设置final
,但很可能不仅要设置final
,还要设置static
当您处理ThreadLocal
变量时,值得注意的关键属性是该变量在每个线程中都有一个实例。此外,您必须提供initialValue()
方法的实现,以便类知道如何在需要时构造新对象
请注意,当您有一个普通的类级别变量时,它隐含着这样的变量将有一个副本作为每个实例。在现实世界中,您不会有太多的应用程序来根据实例使用
ThreadLocal
;很可能是在类
级别,也就是说,静态
。通过这种方式,几乎可以确定它是在静态
块中初始化的,还是立即初始化的。在线程局部
变量上使用最终
或静态
与在任何其他变量上使用相同的思想驱动的
最终版
final
关键字用于只能分配一次的变量。如果是全局的,则必须在声明或构造函数中直接赋值。对于
ThreadLocal
而言,这在99%的情况下是有意义的。因为通常情况下,您不会更改ThreadLocal实例,您只会通过ThreadLocal\set(t值)
更改引用的对象
何时使用静态
静态
变量与所属的类
关联,而不是与对象
关联。这意味着类
的所有实例共享相同的静态
变量。
如果ThreadLocal
声明为static
,则该ThreadLocal
变量(以及ThreadLocal
的引用)由所属类的所有对象
共享,您的第二个示例甚至不应该编译。@Codebender,是的,您是对的,因为你是新来的,所以没有考虑过。别忘了接受答案,无论什么时候它最有帮助。另请参见。如果编写类似private ThreadLocal ThreadLocal的代码并稍后在构造函数中初始化它,因为变量ThreadLocal引用不能再更改,我猜它等于private final ThreadLocal ThreadLocal;这个想法对吗?