关于java:应该将threadlocal声明为final字段

Should threadlocal declared as a final field

使用ThreadLocal类进行编程时,该字段应该声明为final吗?
如果编写类似private ThreadLocal<String> threadLocal的代码并稍后在构造函数中对其进行初始化,由于无法再更改变量threadLocal引用,我想它等于private final ThreadLocal<String> threadLocal;是正确的主意吗?多线程类?

1
2
3
4
5
6
7
8
9
10
11
12
13
 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变量时,值得注意的key属性是这样的变量,每个线程都有一个实例。另外,必须为initialValue()方法提供一个实现,以便该类知道如何在需要时构造一个新对象。

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


ThreadLocal变量上使用finalstatic受相同的想法驱动,就像在其他任何变量上使用它们一样。

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

  • 什么时候使用static
  • static变量与拥有的class关联,而不与Object关联。这意味着class的所有实例共享相同的static变量。
    如果将ThreadLocal声明为static,则此ThreadLocal变量(以及ThreadLocal的引用)将由拥有的class的所有Objects共享。