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.Thread的ThreadLocalMap 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、相同hash,key不同,當(dāng)前元素做為單向鏈的第一個(gè)元素,原來第一個(gè)元素做為當(dāng)前元素的下一個(gè)。
ThreadLocalMap策略:a相同,是不存在b情況;以ThreadLocal作為key,ThreadLocal的threadLocalHashCode由原子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)理解