<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ThreadLocal與synchronized

    Posted on 2009-08-25 20:36 林光炎 閱讀(971) 評論(0)  編輯  收藏 所屬分類: JAVA

    相關(guān)文章:  
    正確理解ThreadLocal
    ThreadLocal與synchronized

    推薦圈子: Pipboy
    更多相關(guān)推薦
    昨天上Java版塊逛了一圈,一個2萬5千人瀏覽的帖子引起了偶滴注意 ThreadLocal與synchronized ,9頁以上的回復(fù),足見大家對這個問題的興趣。

    老實說,從看到這個帖子的題目開始,就覺得帖子的作者估計是在概念上有所混淆了,于是乎想寫個咚咚,同大家分享一下自己的心得。

    帖子上,討論的人很多,高手不乏,各抒己見,但不知新手們看明白沒有,因此,這里偶以最簡潔列表方式來說一說相關(guān)問題。

    1.區(qū)別ThreadLocal 與 synchronized

    ThreadLocal是一個線程隔離(或者說是線程安全)的變量存儲的管理實體(注意:不是存儲用的),它以Java類方式表現(xiàn);
    synchronized是Java的一個保留字,只是一個代碼標(biāo)識符,它依靠JVM的鎖機(jī)制來實現(xiàn)臨界區(qū)的函數(shù)、變量在CPU運行訪問中的原子性。
    兩者的性質(zhì)、表現(xiàn)及設(shè)計初衷不同,因此沒有可比較性。

    2.理解ThreadLocal中提到的變量副本
    事實上,我們向ThreadLocal中set的變量不是由ThreadLocal來存儲的,而是Thread線程對象自身保存。當(dāng)用戶調(diào)用ThreadLocal對象的set(Object o)時,該方法則通過Thread.currentThread()獲取當(dāng)前線程,將變量存入Thread中的一個Map內(nèi),而Map的Key就是當(dāng)前的ThreadLocal實例。請看源碼,這是最主要的兩個函數(shù),能看出ThreadLocal與Thread的調(diào)用關(guān)系:

    Java代碼
    public void set(T value) {   
            Thread t = Thread.currentThread();   
            ThreadLocalMap map = getMap(t);   
            if (map != null)   
                map.set(this, value);   
            else  
                createMap(t, value);   
    }   
      
    ThreadLocalMap getMap(Thread t) {   
            return t.threadLocals;   
    }  
    public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
    }

    ThreadLocalMap getMap(Thread t) {
            return t.threadLocals;
    }

    (有興趣的朋友可以閱讀Java的ThreadLocal源碼)因此,我們可以知道,所謂的變量副本,即是對Object Reference(對象引用)的拷貝。

    3.理解Thread和 ThreadLocal對變量的引用關(guān)系
    實際上Thread和ThreadLocal對變量引用關(guān)系就像是坐標(biāo)系中的X軸和Y軸,是從兩個維度上來組織對變量的引用的。

    首先說Thread。 我們知道一個ThreadOne的執(zhí)行會貫穿多個方法MethodA、MethodB、MethodC這些方法可能分布于不同的類實例。假設(shè),這些方法分別使用了ThreadLocalA、ThreadLocalB、ThreadLocalC來保存線程本地變量,那么這些變量都存于ThreadOne的Map中,并使用各自的ThreadLocal實例作為key。 因此,可以認(rèn)為,借助ThreanLocal的set方法,在X軸上,Thread橫向關(guān)聯(lián)同一線程上下文中來自多個Method的變量引用副本。


     


    接著說ThreadLocal。 一個MethodA中的X變量將被多個線程ThreadOne、ThreadTwo、ThreadThree所訪問。假設(shè)MethodA使用ThreadLocal存儲X,通過set方法,以ThreadLocal作為key值,將不同線程來訪時的不同的變量值引用保存于ThreadOne、ThreadTwo、ThreadThree的各自線程上下文中,確保每個線程有自己的一個變量值。因此,可以認(rèn)為,ThreadLocal是以Method為Y軸,縱向關(guān)聯(lián)了處于同一方法中的不同線程上的變量。


     

    希望能對大家有所幫助,這樣可以少走很多彎路哦。

    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/yangairong1984/archive/2008/04/15/2294572.aspx

    posts - 104, comments - 33, trackbacks - 0, articles - 0

    Copyright © 林光炎

    主站蜘蛛池模板: 美女黄色毛片免费看| 亚洲免费网站观看视频| 国产精品网站在线观看免费传媒 | 99re视频精品全部免费| 亚洲AV无码一区二区乱孑伦AS| 亚欧国产一级在线免费| 精品亚洲一区二区三区在线观看| 香港特级三A毛片免费观看| 天堂亚洲免费视频| 一区二区三区免费在线视频| 亚洲国产一成久久精品国产成人综合| 思思久久99热免费精品6| 亚洲性久久久影院| 国产精品免费福利久久| 亚洲视频一区在线| 国产精品成人免费一区二区| 亚洲avav天堂av在线网毛片| 亚洲国产精品日韩| 国产成人精品一区二区三区免费| 亚洲精品在线播放| 波多野结衣久久高清免费 | 偷自拍亚洲视频在线观看| 全黄a免费一级毛片人人爱| 国产97视频人人做人人爱免费| 久久青青草原亚洲AV无码麻豆| 2020久久精品国产免费| 亚洲乱理伦片在线观看中字| 亚洲国产小视频精品久久久三级 | 日本不卡视频免费| 中文字幕成人免费高清在线视频 | 日日摸夜夜添夜夜免费视频| 亚洲AV福利天堂一区二区三| 无人影院手机版在线观看免费| 男女作爱免费网站| 亚洲国产精品国自产拍电影| 成人免费无码大片A毛片抽搐色欲| 一级毛片成人免费看a| 亚洲欧洲尹人香蕉综合| 亚洲精品人成无码中文毛片| 最近中文字幕免费mv在线视频| 色偷偷亚洲第一综合|