題記:一直對ThreadLocal疑惑,聽完facebook大牛演講后,總結點東西。
一、ThreadLocal的作用,整體結構
二、源代碼簡單分析
1.set方法
2.get方法
三、使用場景實例 ibatis SqlMapClientImp
后記:折騰半天,文章的樣式也調整不好,打包上傳。但愿能幫到別人。
http://www.tkk7.com/Files/shijian/ThreadLocal.rar [請用“web版式視圖”閱讀]
遺留問題:
1.Thread的ThreadLocalMap threadLocals 屬性什么時候實例化 ? 線程實例化時嗎 ?
答:第一次set時,會判斷是否為null,若為null,初始化。
2.ThreadLocalMap replaceStaleEntry(key,
value, i); 做了什么 ?
答:全清洗stale對象;存放當前對象在發現的第一個stale位置。因為Entry是繼承WeakRerfence,任何一次的垃圾收集,都會導致其引用的對象被回收。
4.與Map方式的一些區別 ?
Map策略:a、相同hash&key,覆蓋value; b、相同hash,key不同,當前元素做為單向鏈的第一個元素,原來第一個元素做為當前元素的下一個。
ThreadLocalMap策略:a相同,是不存在b情況;以ThreadLocal作為key,ThreadLocal的threadLocalHashCode由原子AtomicInteger計算getAndAdd(0x61c88647)得到;在Entry[]數組的位置,通過threadLocalHashCode
& (length-1)計算;對于b情況,繼續查找Entry[]數組的下一個位置,是否可存放(key相同或null);當size>=threshold(len*2/3)做resize=oldLen*2.
3.ThreadLocalMap getEntryAfterMiss(ThreadLocal key, int i, Entry e);
答:作用,查找沒有存放在hash計算出index位置的元素。為什么出現此情況?見4,由ThreadLocalMap策略決定.