threadlocal应该声明为final字段

时间:2016-07-22 03:11:23

标签: java multithreading thread-safety final thread-local

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

2 个答案:

答案 0 :(得分:2)

最重要的是,您不必final ThreadLocal,但您很可能不只是final而且还有static

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

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

答案 1 :(得分:0)

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

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

    1. 何时使用static
    2. static变量与拥有Class相关联,而不与Object相关联。这意味着Class的所有实例共享相同的static变量 如果ThreadLocal被声明为static,那么ThreadLocal变量(以及ThreadLocal的引用)将由拥有Objects的所有Class共享}}