应该将 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
变量上使用 final
或 static
与在任何其他变量上使用它们的想法相同。
- 何时使用
final
?
final
关键字用于只能赋值一次的变量。如果是全局的,则必须在声明时或在构造函数中直接赋值。
在 ThreadLocal
的情况下,这在 99% 的情况下是有意义的。因为通常情况下,您不会更改 ThreadLocal 实例,您只会更改引用的 Object
到 ThreadLocal#set(T value)
.
- 什么时候使用
static
?
一个 static
变量关联到拥有的 Class
而不是 Object
。这意味着 Class
的所有实例共享相同的 static
变量。
如果 ThreadLocal
声明为 static
,则此 ThreadLocal
变量(以及 ThreadLocal
的引用)由拥有 [=20] 的所有 Objects
共享=].
使用 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
变量上使用 final
或 static
与在任何其他变量上使用它们的想法相同。
- 何时使用
final
?
final
关键字用于只能赋值一次的变量。如果是全局的,则必须在声明时或在构造函数中直接赋值。
在 ThreadLocal
的情况下,这在 99% 的情况下是有意义的。因为通常情况下,您不会更改 ThreadLocal 实例,您只会更改引用的 Object
到 ThreadLocal#set(T value)
.
- 什么时候使用
static
?
一个 static
变量关联到拥有的 Class
而不是 Object
。这意味着 Class
的所有实例共享相同的 static
变量。
如果 ThreadLocal
声明为 static
,则此 ThreadLocal
变量(以及 ThreadLocal
的引用)由拥有 [=20] 的所有 Objects
共享=].