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);
}
}