Java threadlocal是否应声明为最终字段

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

使用ThreadLocal类编程时,字段是否应声明为final? 如果编写类似于
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;这个想法对吗?