【java】为何通常“将ThreadLocal变量设置为static”?

本文参考了:https://www.zhihu.com/question/35250439

理由:

为了避免重复创建TSO(thread specific object,即与线程相关的变量。)
需要注意的是:无法解决共享对象的更新问题。(引用于《阿里巴巴JAVA开发规范》)我的理解是,static定义的类变量本来是可以进行变量共享的,但是因为ThreadLocal根除了对变量的共享,所以static Thread< xxx> object无法实现类的共享和同步更新。

分析

我们知道,一个ThreadLocal实例对应当前线程中的一个TSO实例。因此,如果把ThreadLocal声明为某个类的实例变量(而不是静态变量),那么每创建一个该类的实例就会导致一个新的TSO实例被创建。显然,这些被创建的TSO实例是同一个类的实例。于是,同一个线程可能会访问到同一个TSO(指类)的不同实例,这即便不会导致错误,也会导致浪费(重复创建等同的对象)!因此,一般我们将ThreadLocal使用static修饰即可。

由于ThreadLocal是某个类的一个静态变量。因此,只要相应的类没有被垃圾回收掉,那么这个类就会持有对相应ThreadLocal实例的引用。

什么是ThreadLocal?

java.lang.ThreadLocal类实现了线程的本地存储,我们可以用该类来创建和管理线程。

ThreadLocal的内部实现:

ThreadLocal的内部实现包括一个类似HashMap的对象,这里称之为ThreadLocalMap。ThreadLocalMap的key会持有对ThreadLocal实例的弱引用(Weak Reference),value会引用TSO实例。

具体的可以参考:彻底理解ThreadLocal

ThreadLocal的使用:

《thinking in java 第四版》p690

你可能感兴趣的:(java)