石建 | Fat Mind

          ThreadLocal小理解


          題記:一直對ThreadLocal疑惑,聽完facebook大牛演講后,總結(jié)點(diǎn)東西。

          一、ThreadLocal的作用,整體結(jié)構(gòu)

          二、源代碼簡單分析
            1.set方法
            2.get方法

          三、使用場景實(shí)例 ibatis SqlMapClientImp

          后記:折騰半天,文章的樣式也調(diào)整不好,打包上傳。但愿能幫到別人。
          http://www.aygfsteel.com/Files/shijian/ThreadLocal.rar [請用“web版式視圖”閱讀]


          遺留問題:

                1.ThreadThreadLocalMap threadLocals 屬性什么時(shí)候?qū)嵗?/span> 線程實(shí)例化時(shí)嗎
          答:第一次set時(shí),會(huì)判斷是否為null,若為null,初始化。

          2.
          ThreadLocalMap replaceStaleEntry(key, value, i); 做了什么
          答:全清洗stale對象;存放當(dāng)前對象在發(fā)現(xiàn)的第一個(gè)stale位置。因?yàn)镋ntry是繼承WeakRerfence,任何一次的垃圾收集,都會(huì)導(dǎo)致其引用的對象被回收。

          4.與Map方式的一些區(qū)別
          Map策略:a、相同hash&key,覆蓋value b、相同hashkey不同,當(dāng)前元素做為單向鏈的第一個(gè)元素,原來第一個(gè)元素做為當(dāng)前元素的下一個(gè)。
          ThreadLocalMap策略:a相同,是不存在b情況;以ThreadLocal作為keyThreadLocalthreadLocalHashCode由原子AtomicInteger計(jì)算getAndAdd(0x61c88647)得到;在Entry[]數(shù)組的位置,通過threadLocalHashCode & (length-1)計(jì)算;對于b情況,繼續(xù)查找Entry[]數(shù)組的下一個(gè)位置,是否可存放(key相同或null);當(dāng)size>=threshold(len*2/3)做resize=oldLen*2. 


          3.
          ThreadLocalMap  getEntryAfterMiss(ThreadLocal key, int i, Entry e)
          答:作用,查找沒有存放在hash計(jì)算出index位置的元素。為什么出現(xiàn)此情況?見4,由ThreadLocalMap策略決定.

          posted on 2010-12-11 18:50 石建 | Fat Mind 閱讀(327) 評論(0)  編輯  收藏 所屬分類: 一點(diǎn)理解

          導(dǎo)航

          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          What 、How、Why,從細(xì)節(jié)中尋找不斷的成長點(diǎn)
          主站蜘蛛池模板: 建德市| 开远市| 磴口县| 邵东县| 高青县| 蒲江县| 保定市| 怀远县| 鄂托克旗| 巴彦县| 通化市| 东辽县| 景德镇市| 平武县| 通城县| 义乌市| 平定县| 克拉玛依市| 蒲城县| 乌鲁木齐市| 勐海县| 铜陵市| 宜川县| 龙游县| 边坝县| 尤溪县| 合山市| 祁门县| 长沙市| 清原| 绥棱县| 淮阳县| 柯坪县| 柘荣县| 平江县| 荥阳市| 祁东县| 仁怀市| 峨眉山市| 犍为县| 新野县|