应该将 threadlocal 声明为最终字段

Should threadlocal declared as a final field

使用 ThreadLocal class 编程时,字段是否应该声明为 final? 如果写成private ThreadLocal<String> threadLocal这样的代码,后面在constructor中初始化,由于变量threadLocal引用不能再改变了,我猜它等于private final ThreadLocal<String> threadLocal;这个想法对吗?下面的方法有什么区别在多线程中 class?

 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>();
        }
    }

底线是您不必在 ThreadLocal 上有 final,但您很可能不仅有 final,还有 static

当您处理 ThreadLocal 变量时,值得注意的关键属性是这样的变量每个线程都有一个实例。此外,您必须提供 initialValue() 方法的实现,以便 class 知道如何在需要时构造新对象。

请注意,当您有一个普通的 class 级别变量时,隐含的是该变量将根据实例具有一个副本。在现实世界中,您不会有太多的应用程序来拥有每个实例的 ThreadLocal;并且很可能您在 class 级别上拥有它,即 static。通过这种方式,几乎可以肯定会在 static 块中或立即对其进行初始化。

ThreadLocal 变量上使用 finalstatic 与在任何其他变量上使用它们的想法相同。

  1. 何时使用 final

final关键字用于只能赋值一次的变量。如果是全局的,则必须在声明时或在构造函数中直接赋值。
ThreadLocal 的情况下,这在 99% 的情况下是有意义的。因为通常情况下,您不会更改 ThreadLocal 实例,您只会更改引用的 ObjectThreadLocal#set(T value).

  1. 什么时候使用static

一个 static 变量关联到拥有的 Class 而不是 Object。这意味着 Class 的所有实例共享相同的 static 变量。
如果 ThreadLocal 声明为 static,则此 ThreadLocal 变量(以及 ThreadLocal 的引用)由拥有 [=20] 的所有 Objects 共享=].