什么是ThreadLocal

什么是ThreadLocal

ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据,线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用。

ThreadLocal提供了线程安全的另一种思路,我们平常说的线程安全主要是保证共享数据的并发访问问题,通过sychronized锁或者CAS无锁策略来保证数据的一致性。

对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。

1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。

  • 从map中获取线程存储的K-V Entry节点。
  • 从Entry节点获取存储的Value副本值返回。
  • map为空的话返回初始值null,即线程变量副本为null,需要注意的是在使用中要判断是否为空指针NullPointerException。

2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。

  • map非空,则重新将ThreadLocal和新的value副本放入到map中。
  • map空,则对线程的成员变量ThreadLocalMap进行初始化创建,并将ThreadLocal和value副本放入map中。

2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。

3、ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。

4、ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。

ThreadLocal的核心机制:

什么是ThreadLocal

每个Thread线程内部都有一个Map。

Map里面存储线程本地对象(key)和线程的变量副本(value)

Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。

对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,彼此之间互不干扰。


分享到:


相關文章: