ThreadLocal 是面試常考知識點,比如:ThreadLocal 是什么、如何使用、底層如何存盤本地變數、set() 詳細流程、rehash() 詳細流程、get() 詳細流程、remove() 詳細流程、為什么使用弱參考等等,本篇文章一一為您解答,祝各位順利找到滿意的高薪作業!
我這里也整理了一些面試常問的面試題和知識點,有需要的朋友可以點一點下方鏈接免費領取!
鏈接:1103806531暗號:CSDN
基礎知識
ThreadLocal是執行緒區域變數,和普通變數的不同在于:每個執行緒持有這個變數的一個副本,可以獨立修改(set方法)和訪問(get方法)這個變數,并且執行緒之間不會發生沖突,
類中定義的ThreadLocal實體一般會被 private static 修飾,這樣可以讓ThreadLocal實體的狀態和Thread系結在一起,業務上,一般用ThreadLocal包裝一些業務ID(user ID或事務ID)——不同的執行緒使用的ID是不相同的,
如何使用
case1
從某個角度來看,ThreadLocal為Java并發編程提供了額外的思路——避免并發,如果某個物件本身是非執行緒安全的,但是你想實作多執行緒同步訪問的效果,例如SimpleDateFormat,你可以使用ThreadLocal變數,

注意,這里針對每個執行緒只需要初始化一次SimpleDateFormat物件,其實跟在自定義執行緒中定義一個SimpleDateFormat成員變數,并在執行緒初始化的時候new這個物件,效果是一樣的,只是這樣看起來代碼更規整,
case2
之前在yunos做酷盤專案的資料遷移時,我們需要按照用戶維度去加鎖,每個執行緒在處理遷移之前,都需要先獲取當前用戶的鎖,每個鎖的key是帶著用戶資訊的,因此也可以使用ThreadLocal變數實作:

case3
下面這個例子,我們定義了一個MyRunnable物件,這個MyRunnable物件會被執行緒1和執行緒2使用,但是通過內部的ThreadLocal變數,每個執行緒訪問到的整數都是自己單獨的一份,

ThreadLocal關鍵知識點
原始碼分析
ThreadLocal是如何被執行緒使用的?原理如下圖所示:Thread參考和ThreadLocal參考都在堆疊上,Thread參考會參考一個ThreadLocalMap物件,這個map中的key是ThreadLocal物件(使用WeakReference包裝),value是業務上變數的值,

ThreadLocal物件何時被回收?
ThreadLocalMap中的key是ThreadLocal物件,然后ThreadLocal物件時被WeakReference包裝的,這樣當沒有強參考指向該ThreadLocal物件之后,或者說Map中的ThreadLocal物件被判定為弱參考可達時,就會在垃圾收集中被回收掉,看下Entry的定義:

ThreadLocal和執行緒池一起使用?
ThreadLocal物件的生命周期跟執行緒的生命周期一樣長,那么如果將ThreadLocal物件和執行緒池一起使用,就可能會遇到這種情況:一個執行緒的ThreadLocal物件會和其他執行緒的ThreadLocal物件串掉,一般不建議將兩者一起使用,
最后
希望這篇文章對大家有幫助!
由于篇幅有限,這邊只展示一部分,我這邊也整理了一份 架構師全套視頻教程 和關于java的系統化資料,包括java核心知識點、面試專題和20年最新的互聯網真題、電子書等都有,有需要的朋友可以點一點下方鏈接免費領取!
鏈接:1103806531暗號:CSDN


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/82612.html
標籤:其他
