目录
- 介绍
- 图解
- 底层代码解析
ThreadLocal是一个Java中的类,用于在多线程环境下存储线程本地变量。每个线程都可以独立访问自己的ThreadLocal变量,而不会影响其他线程的变量。ThreadLocal通常用来解决多线程并发访问共享变量时的线程安全性问题。
ThreadLocal类提供了get()和set()方法来获取和设置线程本地变量的值。当一个线程访问ThreadLocal变量时,实际上是访问该线程自己的变量副本,而不是共享变量。这样可以避免线程间的竞争和冲突。
ThreadLocal在很多情况下都是一个非常有用的工具,特别是在多线程环境下需要保持线程安全性的情况下。例如,在Web应用程序中,可以使用ThreadLocal来存储用户的登录信息,以便在整个请求处理过程中都可以访问到这些信息,而不需要传递参数。
介绍
- ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
- ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]
- ThreadLocal 可以像 Map 一样存取数据,key 为当前线程, get 方法
- 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数
据,就需要使用多个 ThreadLocal 对象实例 - 每个 ThreadLocal 对象实例定义的时候,一般为 static 类型
- ThreadLocal 中保存数据,在线程销毁后,会自动释放
图解
底层代码解析
public void set(T value) {
//1. 获取当前线程, 关联到当前线程!
Thread t = Thread.currentThread();
//2. 通过线程对象, 获取到ThreadLocalMap
// ThreadLocalMap 类型 ThreadLocal.ThreadLocalMap
ThreadLocalMap map = getMap(t);
//3. 如果map不为null, 将数据(dog,pig..) 放入map -key:threadLocal value:存放的数据
// 从这个源码我们已然看出一个threadlocal只能关联一个数据,如果你set, 就会替换
//4. 如果map为null, 就创建一个和当前线程关联的ThreadLocalMap, 并且该数据放入
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
//1. 先得到当前的线程对象
Thread t = Thread.currentThread();
//2.通过线程获取到对应的ThrealLocalMap
ThreadLocalMap map = getMap(t);
if (map != null) {
//3. 如果map不为空, 根据当前的 threadlocal对象,得到对应的Entry
ThreadLocalMap.Entry e = map.getEntry(this);
//4. 如果e 不为null
if (e != null) {
@SuppressWarnings("unchecked")
//返回当前threadlocal关联的数据value
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}