【问题标题】:Should threadlocal declared as a final field是否应该将 threadlocal 声明为 final 字段
【发布时间】:2016-07-22 03:11:23
【问题描述】:

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

【问题讨论】:

  • 你的第二个例子甚至不应该编译。
  • @Codebender,是的,你是对的,没有太多考虑
  • 既然你是新来的,不要忘记接受答案,只要它最有帮助。另请参阅meta.stackexchange.com/questions/5234/…

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


【解决方案1】:

最重要的是,您不必在 ThreadLocal 上显示 final,但您很可能不仅在其上拥有 final,而且在其上还有 static

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

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

【讨论】:

  • 如果写private ThreadLocal threadLocal这样的代码,稍后在构造函数中初始化它,由于变量threadLocal的引用不能再改变,我猜它等于private final ThreadLocal threadLocal;这个想法对吗?
【解决方案2】:

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

  1. 何时使用final

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

  1. 何时使用static

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

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多