java面試必備之ThreadLocal

按照傳統(tǒng)的經(jīng)驗坝咐,如果某個對象是非線程安全的输玷,在多線程環(huán)境下對象的訪問需要采用synchronized進(jìn)行同步福也。但是模板類并未采用線程同步機制工育,因為線程同步會降低系統(tǒng)的并發(fā)性能,此外代碼同步解決線程安全問題的挑戰(zhàn)很大鹃愤,可能會增加好幾倍的實現(xiàn)難度簇搅。那么模板類到底采用什么方法來解決線程安全的難題呢?答案就是ThreadLocal软吐。

ThreadLocal是什么

顧名思義瘩将,ThreadLocal不是一個線程而是一個線程的本地化對象。當(dāng)工作于多線程環(huán)境中的對象采用ThreadLocal維護(hù)變量時凹耙,ThreadLocal為每個使用該變量的線程分配一個獨立的副本姿现。每個線程都可以獨立的改變自己的副本,而不影響其他線程的副本肖抱。

ThreadLocal的接口方法

  • void set(Object value) 設(shè)置當(dāng)前線程的線程局部變量的值

  • public Object get() 返回當(dāng)前線程的線程局部變量的值

  • public void remove() 刪除當(dāng)前線程的局部變量的值

  • protected Object initialValue() 返回當(dāng)前線程局部變量的初始值

那么ThreadLocal是如何做到為每一個線程維護(hù)一份獨立的變量副本的呢备典? 其實思路很簡單,在ThreadLocal類中有一個Map,Map中的鍵為線程對象意述,值為對應(yīng)線程的變量副本提佣。我們自己就可以實現(xiàn)一個簡單的版本如下:

image

一個ThreadLocal實例

image

ThreadLocal與線程同步機制的比較

線程同步機制通過對象的鎖機制保證同一時間只有一個線程去訪問變量,該變量時多個線程共享的荤崇。ThreadLocal則為每一個線程提供了一個變量副本拌屏,從而隔離了多個線程訪問數(shù)據(jù)的沖突,ThreadLocal提供了線程安全的對象封裝术荤,在編寫多線程代碼時倚喂,可以把不安全的代碼封裝進(jìn)ThreadLocal。概括的說,對于多線程資源共享的問題,線程同步機制采取了時間換空間的方式,訪問串行化,對象共享化揍异;而ThreadLocal采取了空間換時間的方式,訪問并行化,對象獨享化宙地。

Spring中采用ThreadLocal解決線程安全的問題

我們知道一般情況下,只有無狀態(tài)的bean才可以在多線程環(huán)境下共享喧兄,在spring中絕大多數(shù)的bean都可以聲明為singleton作用域无畔。就是因為spring對一些非線程安全的“狀態(tài)性對象”采用了ThreadLocal進(jìn)行封裝啊楚,讓它們成為線程安全的對象,因此有狀態(tài)的bean就可能以singleton的方式在多線程中正常工作了浑彰。

下面的實例能夠體現(xiàn)spring對有狀態(tài)bean的改造思路:

 public class TopicDao {
 private Connection conn;
     public void addTopic(){
     Statement stat = conn.createStatement();
     ...
   }
 }

上面代碼由于conn是非線程安全的成員變量恭理,因此addTopic方法是非線程安全的。下面使用ThreadLocal對該變量進(jìn)行改造郭变,使之變成線程安全的變量:

public class TopicDao {
    private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>();
    private static Connection getConnection(){
        if(connThreadLocal.get()==null){
            Connection conn = ConnectionManager.getConnection();
            connThreadLocal.set(conn);
            return conn;
        }else{
            return connThreadLocal.get();
        }
    }
    public void addTopic(){
        Statement stat = getConnection.createStatement();
        ...
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颜价,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诉濒,更是在濱河造成了極大的恐慌周伦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件未荒,死亡現(xiàn)場離奇詭異专挪,居然都是意外死亡,警方通過查閱死者的電腦和手機片排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門寨腔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人率寡,你說我怎么就攤上這事迫卢。” “怎么了冶共?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵乾蛤,是天一觀的道長。 經(jīng)常有香客問我比默,道長幻捏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任命咐,我火速辦了婚禮篡九,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘醋奠。我一直安慰自己榛臼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布窜司。 她就那樣靜靜地躺著沛善,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塞祈。 梳的紋絲不亂的頭發(fā)上金刁,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音,去河邊找鬼尤蛮。 笑死媳友,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的产捞。 我是一名探鬼主播醇锚,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坯临!你這毒婦竟也來了焊唬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤看靠,失蹤者是張志新(化名)和其女友劉穎赶促,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衷笋,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡芳杏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辟宗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爵赵。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泊脐,靈堂內(nèi)的尸體忽然破棺而出空幻,到底是詐尸還是另有隱情,我是刑警寧澤容客,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布秕铛,位于F島的核電站,受9級特大地震影響缩挑,放射性物質(zhì)發(fā)生泄漏但两。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一供置、第九天 我趴在偏房一處隱蔽的房頂上張望谨湘。 院中可真熱鬧,春花似錦芥丧、人聲如沸紧阔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擅耽。三九已至,卻和暖如春物遇,著一層夾襖步出監(jiān)牢的瞬間乖仇,已是汗流浹背憾儒。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留这敬,地道東北人航夺。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像崔涂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子始衅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理冷蚂,服務(wù)發(fā)現(xiàn),斷路器汛闸,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 從三月份找實習(xí)到現(xiàn)在蝙茶,面了一些公司,掛了不少诸老,但最終還是拿到小米隆夯、百度、阿里别伏、京東蹄衷、新浪、CVTE厘肮、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,240評論 11 349
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4493116...
    王帥199207閱讀 2,397評論 0 19
  • 先介紹去掉標(biāo)題欄的方法: 第一種:也一般入門的時候經(jīng)常使用的一種方法 第二種:在AndroidManifest.x...
    插兜閱讀 399評論 0 1
  • 當(dāng)我停留在這無際的草原愧口,這一切都如同彌留的記憶,仿佛曾經(jīng)踏進(jìn)過我生命的沼澤类茂,一樣的溝壑耍属,一樣起起伏伏的輪廓,而...
    徐育業(yè)閱讀 392評論 0 2