使用ThreadLocal类编程时,字段是否应声明为final?
如果写代码如private ThreadLocal<String> threadLocal
并稍后在构造函数中初始化它,因为变量threadLocal引用不能再被更改,我想它等于private final ThreadLocal<String> 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>();
}
}
答案 0 :(得分:2)
最重要的是,您不必final
ThreadLocal
,但您很可能不只是final
而且还有static
。
当您处理ThreadLocal
变量时,明显的键属性是这样的变量,每个线程都有一个实例。此外,您必须为initialValue()
方法提供实现,以便类知道如何在需要时构造新对象。
请注意,当您拥有普通的类级别变量时,它隐含的是这样的变量将按照实例具有副本。在现实世界中,根据实例,您不会拥有太多的应用程序来拥有ThreadLocal
;并且很可能是class
级别的,static
。通过这种方式,它几乎肯定会在static
块中或立即初始化。
答案 1 :(得分:0)
在final
变量上使用static
或ThreadLocal
的想法与在任何其他变量上使用它们的想法相同。
final
? final
关键字用于只能分配一次的变量。如果是全局的,则必须在声明或构造函数中直接分配
在ThreadLocal
的情况下,这种情况在99%的情况下有意义。因为通常情况下,您不会更改ThreadLocal实例,所以您只会将引用的Object
更改为ThreadLocal#set(T value)
。
static
? static
变量与拥有Class
相关联,而不与Object
相关联。这意味着Class
的所有实例共享相同的static
变量
如果ThreadLocal
被声明为static
,那么ThreadLocal
变量(以及ThreadLocal
的引用)将由拥有Objects
的所有Class
共享}}