轉(zhuǎn)載請注明出處,團隊缺人,有意者私信哈
ThreadLocal 源碼解讀
基本概念
當訪問共享的可變數(shù)據(jù)時,通常需要使用同步。一種避免使用同步的方式就是不共享數(shù)據(jù)。如果僅在單線程內(nèi)訪問數(shù)據(jù),就不需要同步。這種技術(shù)被稱為線程封閉Thread Confinement。當某個對象封閉在一個線程中時,這種用法將自動實現(xiàn)線程安全性,即使被封閉的對象本身不是線程安全的。
線程封閉其中一種實現(xiàn)方式就是ThreadLocal的方式,簡單說,就是對于一個共享變量為每個線程都保存了一個副本,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,使之成為獨立的線程局部變量。
ThreadLocal模式解決的是同一線程中隸屬于不同開發(fā)層次的數(shù)據(jù)共享問題,而不是在不同的開發(fā)層次中進行數(shù)據(jù)傳遞。 使用ThreadLocal模式,可以使得數(shù)據(jù)在不同的編程層次得到有效地共享。
從上面圖中我們可以看到,由于ThreadLocal所操作的是維持于整個Thread生命周期的副本(ThreadLocalMap),所以無論在J2EE程序程序的哪個層次(表示層、業(yè)務邏輯層或者持久層),只要在一個Thread的生命周期之內(nèi),存儲于ThreadLocalMap中的對象都是線程安全的(因為ThreadLocalMap本身僅僅隸屬于當前的執(zhí)行線程,是執(zhí)行線程內(nèi)部的一個屬性變量。我們用圖中的陰影部分來表示這個變量的存儲空間)。而這一點,正是被我們用于來解決多線程環(huán)境中的變量共享問題的核心技術(shù)。ThreadLocal的這一特性也使其能夠被廣泛地應用于J2EE開發(fā)中的許多業(yè)務場景。
摘自: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{
延伸閱讀
- ssh框架
2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖
2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe
2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】
2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞
2017-07-26
- 從棧不平衡問題 理解 calling convention
2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明
2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解
2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析
2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二)
2017-07-26
學習是年輕人改變自己的最好方式