終於明白阿里百度這樣的大公司,為什麼面試經常拿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年經驗進百度是一種什麼樣的體驗?附上百度大佬的面試經驗!面試
- 最終一輪面試被 Google 刷掉,這是一種什麼樣的體驗?面試Go
- 我的春招求職經驗分享(已拿阿里京東網易等 5 個 offer)求職阿里
- 終於拿Rumbaugh 的新書了新書
- Mybatis動態對映,這次終於搞明白了MyBatis
- 分析即服務(AaaS)到底是什麼?終於有人講明白了
- 阿里面試這樣問:redis 為什麼把簡單的字串設計成 SDS?阿里面試Redis字串
- 面試的畢生經驗,都在這裡了面試
- 畢業季offer怎麼拿?收下這份非典型求職面試指南求職面試
- 面試:為了進阿里,死磕了ThreadLocal記憶體洩露原因面試阿里thread記憶體洩露
- 經驗之談:我為什麼選擇了這樣一個激進的快取大Key治理方案快取
- 智慧數字經營是什麼?你疑惑的點,這裡全部說明白了
- 阿里巴巴為什麼能抗住90秒100億?看完這篇你就明白了!阿里
- 終於弄明白了 RocketMQ 的儲存模型MQ模型
- 終於明白了Handler的執行機制
- 為什麼大公司要設定這麼高的門檻?
- 為什麼有些大公司技術弱爆了?
- 阿里面試Redis常考問題阿里面試Redis
- 在大公司寫程式碼是一種什麼樣的體驗?
- 看完這個故事終於知道區塊鏈是什麼了區塊鏈
- 面試官問:ThreadLocal中的鍵為什麼是弱引用?面試thread
- 假如騰訊阿里消失了,這個社會將變成什麼樣?阿里
- bat等大公司常考java多執行緒面試題BATJava執行緒面試題
- 面經手冊 · 第12篇《面試官,ThreadLocal 你要這麼問,我就掛了!》面試thread
- 淺談三層架構 通過這個,+Java開發模式經驗。終於相通了,動軟到底是為什麼這麼做...架構Java模式
- 阿里JAVA面試分享經驗阿里Java面試
- 分享一位同學的阿里、百度前端面試經驗阿里前端面試
- ClickHouse與Hive的區別,終於有人講明白了Hive
- CTQ難理解?這樣說你就明白了
- 【轉】程式設計師求職面試中經常遇到的面試問題程式設計師求職面試
- 最全的阿里面試經驗(一)阿里面試
- 面試小結-那些求職路上的經驗分享與感受面試求職
- 逗比程式媛的灣區FLAGT面試求職經驗面試求職
- 阿里為什麼不收購百度?真相在此阿里
- 終於有人把網路爬蟲講明白了爬蟲
- 終於有人把隱私計算講明白了
- 產品經理,你為什麼要考慮使用者場景?