看乙個案例:
public static void main(string args) , "other thread");
thread.start();
}
輸出:
main
other thread
threadlocal的作用顯而易見:
某變數是執行緒共享變數,但某執行緒下對其的操作僅對該執行緒可見
看下threadlocal.set()方法:
public void set(t value)
拿到當前執行緒的例項,從執行緒例項中獲取map,若map例項非空則賦值;若無,則建立新的map並賦值。
看下map.set()的方法:
private void set(threadlocal<?> key, object value)
if (k == null)
}tab[i] = new entry(key, value);
int sz = ++size;
if (!cleansomeslots(i, sz) && sz >= threshold)
rehash();
}
如上的**大概意思就是將threadlocal 變數作為 entry的 key, 實際值作為entry的value,該entry是儲存在table中的。這裡要注意,entry,table均是threadlocalmap的內部資料結構,該threadlocalmap是thread獨有的。
還有一點需要注意:entry繼承了weakreference, 並將tnreadlocal變數設定為弱引用,為什麼呢,這是因為執行緒有一種不被**的情況(執行緒池中的執行緒),那thread例項就會一直存在,所以其持有的threadlocalmap就會一直存在,但map裡的entry中的threadlocal(該引用在外部是強引用)假如也是強引用,那即使外部引用消失它也不會被gc,所以設定為weakreference,當外部不再引用時其可被gc。
再看一下threadlocal.get()方法
public t get()
}return setinitialvalue();
}
有了set()的分析,不難解析get()的源**
先獲取當前執行緒的例項,然後再獲取該執行緒例項中的threadlocalmap,再根據threadlocal變數在table中獲取entry,從而取出value;
根據原始碼分析,總結了幾點:
1、threadlocal 變數為執行緒獨享變數,所以可以用於需要執行緒隔離使用共享變數的場景
2、執行緒例項中維護的threadlocalmap由於執行緒池的原因可能會一直存在,所以map中的引用threadlocal設定為weakreference,這樣保證了threadlocal不再使用時可以gc
ThreadLocal原始碼理解
threadlocal其實原理是建立了多份相同資料儲存在堆記憶體上,每個執行緒的thread類裡有threadlocal.threadlocalmap threadlocals的屬性來指向存位置,所以每個執行緒修改都不會影響到其他執行緒的資料 首先說下下面用到的東西 threadlocalmap為t...
ThreadLocal原始碼分析
在理解handler looper之前,先來說說threadlocal這個類,聽名字好像是乙個本地執行緒的意思,實際上它並不是乙個thread,而是提供乙個與執行緒有關的區域性變數功能,每個執行緒之間的資料互不影響。我們知道使用handler的時候,每個執行緒都需要有乙個looper物件,那麼and...
ThreadLocal 原始碼解讀
在正式讀 前先簡單介紹threadlocal的實現方式。每個執行緒都會有乙個threadlocalmap,只有在使用到threadlocal的時候才會初始化threadlocalmap。需要儲存的物件t會被放到entry裡面儲存在threadlocalmap的陣列中,entry是乙個鍵值對的資料結構...