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

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

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

    隨筆-204  評論-149  文章-0  trackbacks-0
    轉:http://linliangyi2007.javaeye.com/blog/179040
    關鍵字: java 線程 threadlocal 
     昨天上Java版塊逛了一圈,一個2萬5千人瀏覽的帖子引起了偶滴注意 ThreadLocal與synchronized ,9頁以上的回復,足見大家對這個問題的興趣。

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

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

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

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

     1public void set(T value) {
     2        Thread t = Thread.currentThread();
     3        ThreadLocalMap map = getMap(t);
     4        if (map != null)
     5            map.set(this, value);
     6        else
     7            createMap(t, value);
     8}

     9
    10ThreadLocalMap getMap(Thread t) {
    11        return t.threadLocals;
    12}

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

    3.理解Thread和 ThreadLocal對變量的引用關系
        實際上Thread和ThreadLocal對變量引用關系就像是坐標系中的X軸和Y軸,是從兩個維度上來組織對變量的引用的。
    • 首先說Thread。     我們知道一個ThreadOne的執(zhí)行會貫穿多個方法MethodA、MethodB、MethodC這些方法可能分布于不同的類實例。假設,這些方法分別使用了ThreadLocalA、ThreadLocalB、ThreadLocalC來保存線程本地變量,那么這些變量都存于ThreadOne的Map中,并使用各自的ThreadLocal實例作為key。 因此,可以認為,借助ThreanLocal的set方法,在X軸上,Thread橫向關聯(lián)同一線程上下文中來自多個Method的變量引用副本。



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



    希望能對大家有所幫助,這樣可以少走很多彎路哦。
    posted on 2009-06-01 21:57 Frank_Fang 閱讀(558) 評論(0)  編輯  收藏 所屬分類: Java編程
    主站蜘蛛池模板: 国产精品永久免费| 曰曰鲁夜夜免费播放视频| 亚洲精品线在线观看| 久久久久国产精品免费免费搜索| 亚洲第一综合天堂另类专 | 青柠影视在线观看免费| 亚洲高清日韩精品第一区| 日韩伦理片电影在线免费观看| 一级午夜免费视频| 亚洲成av人片在线看片| 亚洲国产精品成人网址天堂| 19禁啪啪无遮挡免费网站| 粉色视频免费入口| 亚洲美女大bbbbbbbbb| 亚洲成年看片在线观看| 久久久久久毛片免费播放 | 可以免费观看的国产视频| 涩涩色中文综合亚洲| 国产AV无码专区亚洲AV男同| 卡一卡二卡三在线入口免费| 久久青草免费91观看| 无码天堂亚洲国产AV| 亚洲毛片无码专区亚洲乱| 国产精品亚洲二区在线观看 | 国产一卡二卡≡卡四卡免费乱码| 久久免费动漫品精老司机| 深夜a级毛片免费无码| 亚洲乱码中文字幕小综合| 久久99国产亚洲高清观看首页| 日韩一级在线播放免费观看| 久久精品国产免费观看| 久久精品免费电影| 在线播放国产不卡免费视频| 亚洲精品国产suv一区88| 国产成人精品日本亚洲专一区| 亚洲AV无码精品色午夜果冻不卡 | 免费精品久久天干天干| 羞羞视频免费网站含羞草| 亚洲jizzjizz在线播放久| 久久亚洲中文字幕精品有坂深雪| 国产成人高清亚洲|