Java:ThreadLocal

1.定義
  1. 定義:線程局部變量
2.作用
  1. 保存線程獨享的資源。
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.源碼解析

保證線程安全:空間換時間。

  1. 每個線程都有自己的 ThreadLocalMap 對象。
  2. 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);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章