一、ThreadLocal定义

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

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

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

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

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注