1.定义
- 定义:线程局部变量
2.作用
- 保存线程独享的资源。
3.具体使用
public class ThreadLocalDemo {
public static void main(String[] args) {
ThreadLocal<String> threadLocal = new ThreadLocal<>();
new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("线程名:" + Thread.currentThread().getName());
System.out.println(threadLocal.get());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("线程名:" + Thread.currentThread().getName());
System.out.println(threadLocal.get());
}
}).start();
}
}
4.源码解析
保证线程安全:空间换时间。
- 每个线程都有自己的 ThreadLocalMap 对象。
- ThreadLocalMap 的 key = ThreadLocal 实例,value = 线程变量。
public class ThreadLocal<T> {
// 获取线程变量
public T get() {
// 1.获取当前线程
Thread var1 = Thread.currentThread();
// 2.获取当前线程的 ThreadLocalMap。
ThreadLocal.ThreadLocalMap var2 = this.getMap(var1);
// 3.如果 ThreadLocalMap 对象存在,直接获取值;否则初始化 1 个ThreadLocalMap。
if (var2 != null) {
ThreadLocal.ThreadLocalMap.Entry var3 = var2.getEntry(this);
if (var3 != null) {
Object var4 = var3.value;
return var4;
}
}
return this.setInitialValue();
}
// 初始化 ThreadLocal 值。
private T setInitialValue() {
Object var1 = this.initialValue();
// 1.获取当前线程
Thread var2 = Thread.currentThread();
// 2.获取当前线程 ThreadLocalMap对象。
ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
// 3.ThreadLocalMap 已经创建则替换值,否则创建并初始化值
if (var3 != null) {
var3.set(this, var1);
} else {
this.createMap(var2, var1);
}
return var1;
}
// 保存线程变量
public void set(T var1) {
Thread var2 = Thread.currentThread();
ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
if (var3 != null) {
var3.set(this, var1);
} else {
this.createMap(var2, var1);
}
}
ThreadLocal.ThreadLocalMap getMap(Thread var1) {
return var1.threadLocals;
}
void createMap(Thread var1, T var2) {
var1.threadLocals = new ThreadLocal.ThreadLocalMap(this, var2);
}
}