【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值