ThreadLocal相关知识点总结学习

转载于:https://www.talktop.cn/?p=362

1.threadLocal定义
ThreadLocal为线程局部变量,ThreadLocal所定义的变量属于当前线程,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
所以每个线程都可以独立改变自己的副本,而不会影响其它线程所对应的副本

2.threadLocal实现原理
ThreadLocal在不同线程之间数据是隔离的(不同的实例副本,实例副本通过ThreadLocalMap来实现),在同一个线程中不同方法和不同类之间是可以共享的
在不同的线程中的TreadLocal变量是存放在不同的ThreadLocalMap(静态内部类)中,
ThreadLocalMap的存储结构为key、value结构(threadlocal,value)
Thread的key对应的是threadlocal,通过对threadlocal值进行hachcode计算(计算规则:key.threadLocalHashCode & (len-1))得到一个int值,value则为存储的对象
在这里插入图片描述

3.threadLocal常用方法
(1)public void set(T value) 设置当前线程的线程局部变量值
(2)public T get() 获取当前线程的局部变量值
(2)public void remove() 移除当前线程的局部变量值

4.ThreadLocal使用场景
(1)在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束
(2)线程间数据隔离
(3)进行事务隔离,用于存储线程事务信息
(4)数据库连接,seesion会话管理
(5)当前登录用户数据存储

5.ThreadLocal保证线程安全原理
ThreadLocal本身并没有承担存储每个线程中数据的功能,而是通过线程Thread内部的ThreadLocalMap来实现线程之间的隔离,从而保证线程安全。
ThreadLoca赋值操作会首先拿到当前线程对象,通过对象线程获取到线程对应的ThreadLocalMap对象,判断ThreadLocalMap对象是否为空,为空则创建一个,否则进行set操作。
ThreadLocal的set操作会计算数组写入位置(处理一个Thread中存在多个ThreadLocal情况),通过AtomicInteger类getAndAdd()方法得到一个累计值,通过累计值和数组长度进行&运算得到最值写入位置(线性扩展,避免哈希冲突)。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值