終於明白阿里百度這樣的大公司,為什麼面試經常拿ThreadLocal考驗求職者了
點選上面↑「愛開發」關注我們
每晚10點,捕獲技術思考和創業資源洞察
什麼是ThreadLocal
ThreadLocal是一個本地執行緒副本變數工具類,各個執行緒都擁有一份執行緒私有的資料,執行緒之間的變數互不干擾,在高併發場景下,可以實現無狀態的呼叫。
ThreadLocal提供了執行緒安全的另一種思路,我們平常說的執行緒安全主要是保證共享資料的併發訪問問題,通過sychronized鎖或者CAS無鎖策略來保證資料的一致性。
ThreadLocal結構圖
從上面的結構圖,我們已經窺見ThreadLocal的核心機制:
- 每個Thread執行緒內部都有一個Map。
- Map裡面儲存執行緒本地物件(key)和執行緒的變數副本(value)
- Thread內部的Map是由ThreadLocal維護的,由ThreadLocal負責向map獲取和設定執行緒的變數值。
對於不同的執行緒,每次獲取副本值時,別的執行緒並不能獲取到當前執行緒的副本值,形成了副本的隔離,彼此之間互不干擾。
我們來看個例子。
下面的例子有3個執行緒[thread#1],[thread#2],[thread#3]修改類變數initValue,當類變數是ThreadLocal的時候3個執行緒修改的值互不影響,列印的結果都是66
上面的例子3個執行緒是如果做到同時獨立修改變數的,答案就在ThreadLocal的set(),get()方法裡面.
下面我們再來看看ThreadLocal
ThreadLocal類提供如下幾個核心方法:
- get()方法用於獲取當前執行緒的副本變數值。
- set()方法用於儲存當前執行緒的副本變數值。
- initialValue()為當前執行緒初始副本變數值。
- remove()方法移除當前前程的副本變數值。
get()方法
- 獲取當前執行緒的ThreadLocalMap物件threadLocals
- 從map中獲取執行緒儲存的K-V Entry節點。
- 從Entry節點獲取儲存的Value副本值返回。
- map為空的話返回初始值null,即執行緒變數副本為null,需要注意的是在使用中要判斷是否為空指標NullPointerException。
set()方法
- 獲取當前執行緒的成員變數map
- map非空,則重新將ThreadLocal和新的value副本放入到map中。
- map空,則對執行緒的成員變數ThreadLocalMap進行初始化建立,並將ThreadLocal和value副本放入map中。
remove()方法
Thread執行緒內部的Map在類中描述如下:
可以看到,這個ThreadLocalMap是執行緒中的變數,也就是說每個執行緒都是相互獨立的
應用場景
類似單例類TransactionSynchronizationManager,
RequestContextHolder中就是通過ThreadLocal儲存各自執行緒變數的副本,這樣就不需要重新建立類。
一個知識點延伸出這麼多知識點,關於弱引用、 記憶體優化等,不僅能考驗求職者的對該知識點的掌握程度,又能考驗求職者的知識面,難怪阿里百度這樣的大公司喜歡在面試時拿它來考驗求職者。
往期精選推薦
相關文章
- 面試官為什麼喜歡拿 Kafka 考驗求職者面試Kafka求職
- 【面試專題】3年經驗進百度是一種什麼樣的體驗?附上百度大佬的面試經驗!面試
- 畢業季offer怎麼拿?收下這份非典型求職面試指南求職面試
- 最終一輪面試被 Google 刷掉,這是一種什麼樣的體驗?面試Go
- 想入職阿里的Java開發者必看,阿里巴巴面試官實戰經驗分享!阿里Java面試
- 看到這臺概念機,我終於明白為什麼任天堂不做高效能掌機了
- 偽經驗;不稱職面試官的面試經面試
- 我的春招求職經驗分享(已拿阿里京東網易等 5 個 offer)求職阿里
- 面試:為了進阿里,死磕了ThreadLocal記憶體洩露原因面試阿里thread記憶體洩露
- 面經手冊 · 第12篇《面試官,ThreadLocal 你要這麼問,我就掛了!》面試thread
- Python求職怎麼樣?面試成功的關鍵技巧分享Python求職面試
- 8年測試工程師+面試官——寫給求職心切的求職者工程師面試求職
- 面試官問:ThreadLocal中的鍵為什麼是弱引用?面試thread
- Linux面試常問命令及求職心得Linux面試求職
- bat等大公司常考java多執行緒面試題BATJava執行緒面試題
- 終於拿Rumbaugh 的新書了新書
- Mybatis動態對映,這次終於搞明白了MyBatis
- 金三銀四求職季,面試阿里Java崗你必須知道些什麼!求職面試阿里Java
- 半個月6次面試,終於進百度HR面了面試
- 阿里巴巴為什麼能抗住90秒100億?看完這篇你就明白了!阿里
- 求職面試常見問題:Python常見面試題全解析附答案求職Python面試題
- 13 終於,成為自由職業者
- 分析即服務(AaaS)到底是什麼?終於有人講明白了
- 面試常考之業務能力指什麼?如何考察面試
- Java求職者如何提高面試的透過率?Java求職面試
- 2024最新最全Java和Go面經,面試了30多場,終於上岸了!JavaGo面試
- Android春招面經:二本渣院面試網易被拒,最終終於拿到騰訊+阿里offer(已入職騰訊)Android面試阿里
- 求職時這樣回答問題你就輸了!來自IT類面試官視角的深度解讀求職面試
- Python工程師求職必知的經典面試題!Python工程師求職面試題
- Python工程師求職必知的經典面試題Python工程師求職面試題
- 終於弄明白了 RocketMQ 的儲存模型MQ模型
- 作為技術面試官,我在面試時考慮什麼?面試
- Java面試必問,ThreadLocal終極篇Java面試thread
- 經驗之談:我為什麼選擇了這樣一個激進的快取大Key治理方案快取
- 面試阿里,位元組,騰訊90%被問到的springboot常見面試題,這次給你講的明明白白!阿里Spring Boot面試題
- Android面經分享:開發4年裸辭面試20天收割8個offer,終於入職阿里,全是細節!Android面試阿里
- 智慧數字經營是什麼?你疑惑的點,這裡全部說明白了
- 求職者如何應對面試關?怎麼讓考官喜歡求職面試