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>();
}
} |
- 您的第二个示例甚至不应该编译。
-
@Codebender,是的,你是对的,没想到
-
由于您是新来的,只要有帮助,别忘了接受答案。另请参见meta.stackexchange.com/questions/5234/…。
最重要的是,您不必在ThreadLocal上具有final,但是您很可能不仅在其上具有final,而且还具有static。
在处理ThreadLocal变量时,值得注意的key属性是这样的变量,每个线程都有一个实例。另外,必须为initialValue()方法提供一个实现,以便该类知道如何在需要时构造一个新对象。
请注意,当您具有普通的类级变量时,隐含的是该变量将根据实例具有一个副本。在现实世界中,根据实例,您将没有太多的应用程序具有ThreadLocal;并且很可能在class级别上具有它,即static。这样,几乎可以肯定要在static块中或立即对其进行初始化。
- 如果编写类似private ThreadLocal <String> threadLocal的代码并稍后在构造函数中对其进行初始化,则由于无法再更改变量threadLocal引用,我想它等于private final ThreadLocal <String> threadLocal;这个想法正确吗?
在ThreadLocal变量上使用final或static受相同的想法驱动,就像在其他任何变量上使用它们一样。
什么时候使用final?
final关键字用于只能分配一次的变量。如果是全局变量,则必须在声明时或在构造函数中直接分配。
在ThreadLocal的情况下,这在99%的情况下是有意义的。因为通常,您不会更改ThreadLocal实例,所以只能通过ThreadLocal#set(T value)更改引用的Object。
什么时候使用static?
static变量与拥有的class关联,而不与Object关联。这意味着class的所有实例共享相同的static变量。
如果将ThreadLocal声明为static,则此ThreadLocal变量(以及ThreadLocal的引用)将由拥有的class的所有Objects共享。