ThreadLocal介绍以及源码分析
生活随笔
收集整理的這篇文章主要介紹了
ThreadLocal介绍以及源码分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ThreadLocal?線程主變量 前面部分引用其他優(yōu)秀博客,后面源碼自己分析的,如有冒犯請私聊我。 用Java語言開發(fā)的同學對?ThreadLocal?應該都不會陌生,這個類的使用場景很多,特別是在一些框架中經(jīng)常用到,比如數(shù)據(jù)庫事務操作,還有MVC框架中數(shù)據(jù)跨層傳遞。這里我們簡要探討下?ThreadLocal?的內(nèi)部實現(xiàn)及可能存在的問題。 首先問自己一個問題,讓自己實現(xiàn)一個這個的功能類的話怎么去做?第一反應就是簡單構(gòu)造一個?Map<Thread, T>?數(shù)據(jù)結(jié)構(gòu),key是?Thread,value就是我們要保存的線程變量?T。我們看下這種設(shè)計有哪些問題:
- 隨著運行時間越久,存在Map里的Thread越多,當Thread退出時,資源也沒有釋放,存在內(nèi)存泄漏問題
- Map數(shù)據(jù)因為會被多線程訪問,存在資源競爭,所以還必需對Map做同步安全操作,效率低下
3、只要這個線程活著而且實例可以被訪問,這個線程會持有這個變量副本的隱性引用,直到線程消亡,被垃圾回收
ThreadLocal get方法 1、根據(jù)當前thread獲取對應的ThreadLocalMap 如果沒有就初始化設(shè)置一個,如果有就返回 ThreadLocalMap 里面維護的Entry存儲的值 1 public T get() { 2 Thread t = Thread.currentThread(); 3 ThreadLocalMap map = getMap(t); 4 if (map != null) { 5 ThreadLocalMap.Entry e = map.getEntry(this); 6 if (e != null) { 7 @SuppressWarnings("unchecked") 8 T result = (T)e.value; 9 return result; 10 } 11 } 12 return setInitialValue(); 13 }?
?
ThreadLocal 初始化value 倆個步驟 1、在原有的map上設(shè)置值 2、創(chuàng)建一個ThreadLocalMap private T setInitialValue() {T value = initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);return value; }?
?
ThreadLocal rehash 1、先刪除陳舊的Entriy ,如果不能有效的收縮table的長度,而且長度已經(jīng)大于threshold 的0.75(裝載因子)倍了,就直接擴展一倍長度 1 2 /** 3 * Re-pack and/or re-size the table. First scan the entire 4 * table removing stale entries. If this doesn't sufficiently 5 * shrink the size of the table, double the table size. 6 */ 7 private void rehash() { 8 expungeStaleEntries(); 9 10 // Use lower threshold for doubling to avoid hysteresis 11 if (size >= threshold - threshold / 4) 12 resize(); 13 }如果你也有此類問題,可以一起探討(私聊或者評論),一起不斷完善自己的理解,如果覺得可以歡迎關(guān)注我。
轉(zhuǎn)載于:https://www.cnblogs.com/xushengyong/p/10641827.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的ThreadLocal介绍以及源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单的前端上传图片代码
- 下一篇: UOJ#449. 【集训队作业2018】