ThreadLocal保證線程安全(經過源碼進行分析)

首先咱們先來看一下ThreadLocal的四個方法 html

1.void set(T value)this

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
     if (map != null)
        map.set(this, value);
      else createMap(t, value);
}

從上面能夠看出set方法中有一個 T value參數,Thread.currentThread()是一個native的本地方法,返回對當前正在執行的線程對象的引用,有興趣的能夠自行了解spa

ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

這裏的getMap(t)返回的是ThreadLocalMap類型
選區_009.png
這裏借用一下大佬的圖
ThreadLocal類的做用是爲變量在每一個線程中的都建立了副本,每一個線程能夠訪問本身內部的副本變量,線程之間互不影響。
接着咱們來看ThreadLocalMap線程

static class ThreadLocalMap{...}

這是ThreadLocal中維護的一個static類,主要做用是
將線程變量和其副本關聯(映射)起來,同時隔絕了其餘ThreadLocal的訪問,至此咱們可以發現最上面的set方法 就是設置當前線程的線程局部變量的值。code

2.T get()htm

public T get() {
 Thread t = Thread.currentThread();
 ThreadLocalMap map = getMap(t);
 if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
 if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
 return result;
 }
    }
    return setInitialValue();
}

返回線程所對應的線程局部變量的值
3.public void remove()對象

public void remove() {
    ThreadLocalMap m = getMap(Thread.currentThread());
     if (m != null)
        m.remove(this);
}

爲了減小內存的使用,將當前線程局部變量進行刪除,線程結束後會自動被垃圾回收。
4.protected T initialValue()blog

protected T initialValue() {
    return null;
}

這個方法延遲調用,線程第一次調用get()或者set(T value)才執行。內存

參考博文https://www.cnblogs.com/yinbi...rem

相關文章
相關標籤/搜索