轉(zhuǎn)載請(qǐng)注明出處,團(tuán)隊(duì)缺人,有意者私信哈

ThreadLocal 源碼解讀

基本概念

當(dāng)訪(fǎng)問(wèn)共享的可變數(shù)據(jù)時(shí),通常需要使用同步。一種避免使用同步的方式就是不共享數(shù)據(jù)。如果僅在單線(xiàn)程內(nèi)訪(fǎng)問(wèn)數(shù)據(jù),就不需要同步。這種技術(shù)被稱(chēng)為線(xiàn)程封閉Thread Confinement。當(dāng)某個(gè)對(duì)象封閉在一個(gè)線(xiàn)程中時(shí),這種用法將自動(dòng)實(shí)現(xiàn)線(xiàn)程安全性,即使被封閉的對(duì)象本身不是線(xiàn)程安全的。

線(xiàn)程封閉其中一種實(shí)現(xiàn)方式就是ThreadLocal的方式,簡(jiǎn)單說(shuō),就是對(duì)于一個(gè)共享變量為每個(gè)線(xiàn)程都保存了一個(gè)副本,ThreadLocal為每個(gè)使用該變量的線(xiàn)程提供獨(dú)立的變量副本,使之成為獨(dú)立的線(xiàn)程局部變量。

ThreadLocal模式解決的是同一線(xiàn)程中隸屬于不同開(kāi)發(fā)層次的數(shù)據(jù)共享問(wèn)題,而不是在不同的開(kāi)發(fā)層次中進(jìn)行數(shù)據(jù)傳遞。 使用ThreadLocal模式,可以使得數(shù)據(jù)在不同的編程層次得到有效地共享。

從上面圖中我們可以看到,由于ThreadLocal所操作的是維持于整個(gè)Thread生命周期的副本(ThreadLocalMap),所以無(wú)論在J2EE程序程序的哪個(gè)層次(表示層、業(yè)務(wù)邏輯層或者持久層),只要在一個(gè)Thread的生命周期之內(nèi),存儲(chǔ)于ThreadLocalMap中的對(duì)象都是線(xiàn)程安全的(因?yàn)門(mén)hreadLocalMap本身僅僅隸屬于當(dāng)前的執(zhí)行線(xiàn)程,是執(zhí)行線(xiàn)程內(nèi)部的一個(gè)屬性變量。我們用圖中的陰影部分來(lái)表示這個(gè)變量的存儲(chǔ)空間)。而這一點(diǎn),正是被我們用于來(lái)解決多線(xiàn)程環(huán)境中的變量共享問(wèn)題的核心技術(shù)。ThreadLocal的這一特性也使其能夠被廣泛地應(yīng)用于J2EE開(kāi)發(fā)中的許多業(yè)務(wù)場(chǎng)景。
摘自:http://wely.iteye.com/blog/2295284

ThreadLocal使用是比較直觀(guān)的,本次的重點(diǎn)也不在于使用,而在內(nèi)部的實(shí)現(xiàn)方式。

實(shí)現(xiàn)源碼

Thread類(lèi)內(nèi)部維護(hù)了ThreadLocalMap結(jié)構(gòu),但是ThreadLocalMap的維護(hù)交給了ThreadLocal對(duì)象

public class Thread{ 
        		

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式