线程私有-ThreadLocal

线程安全的方式

  1. 不可变
  2. 互斥
  3. 线程私有

ThreadLocal

TheadLocal是通过线程私有变量来实现变量线程安全的一个类

主要用途

  1. 在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束,典型的就是通过切面拦截将用户的登陆信息存储在ThreadLocal中,在后续的调用层里可以直接通过ThreadLocal获取用户信息
  2. 线程间数据隔离,这个看具体业务场景,需要进行哪些数据隔离,比较典型的有连接池,各个线程有自己的变量

实现原理

三个关键类

  • Thread.class
  • ThreadLocal.class
  • ThreadLocalMap.class
ThreadLocal.ThreadLocalMap

static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

这个变量是线程Thread的成员变量,每个Thread都有自己的ThreadLocalMap,以数组的形式存储Entry(ThreadLocal<?> k, Object v),线程私有变量的关键机制就在于此

至于ThreadLocal类的作用主要提供一些操作方法

使用注意事项

由于ThreadLocal<?>是一个弱引用的对象,当ThreadLocal为null,会在下次gc的时候回收,但是value值还在,并且该entry也访问不到了,会造成内存泄漏,时间长了可能会变成内存溢出,所以,我们在不使用ThreadLocal时需要手动remove。

其他类似的数据结构

netty中有FastThreadLocal,主要优化了hash冲突的处理方式,将ThreadLocal里的hash冲突顺序查找改为了预先分配hash槽,提高了这部分逻辑的效率
关于FastThreadLocal具体的实现可以看这篇文章
https://zhuanlan.zhihu.com/p/416151641

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值