轉(zhuǎn)載請注明出處,團隊缺人,有意者私信哈
ThreadLocal 源碼解讀
基本概念
當(dāng)訪問共享的可變數(shù)據(jù)時,通常需要使用同步。一種避免使用同步的方式就是不共享數(shù)據(jù)。如果僅在單線程內(nèi)訪問數(shù)據(jù),就不需要同步。這種技術(shù)被稱為線程封閉Thread Confinement。當(dāng)某個對象封閉在一個線程中時,這種用法將自動實現(xiàn)線程安全性,即使被封閉的對象本身不是線程安全的。
線程封閉其中一種實現(xiàn)方式就是ThreadLocal的方式,簡單說,就是對于一個共享變量為每個線程都保存了一個副本,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,使之成為獨立的線程局部變量。
ThreadLocal模式解決的是同一線程中隸屬于不同開發(fā)層次的數(shù)據(jù)共享問題,而不是在不同的開發(fā)層次中進行數(shù)據(jù)傳遞。 使用ThreadLocal模式,可以使得數(shù)據(jù)在不同的編程層次得到有效地共享。
從上面圖中我們可以看到,由于ThreadLocal所操作的是維持于整個Thread生命周期的副本(ThreadLocalMap),所以無論在J2EE程序程序的哪個層次(表示層、業(yè)務(wù)邏輯層或者持久層),只要在一個Thread的生命周期之內(nèi),存儲于ThreadLocalMap中的對象都是線程安全的(因為ThreadLocalMap本身僅僅隸屬于當(dāng)前的執(zhí)行線程,是執(zhí)行線程內(nèi)部的一個屬性變量。我們用圖中的陰影部分來表示這個變量的存儲空間)。而這一點,正是被我們用于來解決多線程環(huán)境中的變量共享問題的核心技術(shù)。ThreadLocal的這一特性也使其能夠被廣泛地應(yīng)用于J2EE開發(fā)中的許多業(yè)務(wù)場景。
摘自:http://wely.iteye.com/blog/2295284
ThreadLocal使用是比較直觀的,本次的重點也不在于使用,而在內(nèi)部的實現(xiàn)方式。
實現(xiàn)源碼
Thread類內(nèi)部維護了ThreadLocalMap結(jié)構(gòu),但是ThreadLocalMap的維護交給了ThreadLocal對象
public class Thread{
網(wǎng)友評論