ThreadLocal的技術考查點

2021-08-14 21:16:37 字數 1085 閱讀 2930

如果防止本地執行緒的變數被其他執行緒修改?

我們的想法就是乙個執行緒建立乙個例項物件,但是這樣會引起幾個問題:什麼時候建立?什麼時候銷毀?哪些執行緒需要建立?

而threadlocal實現了「防止本地執行緒的變數被其他執行緒修改」,同時避免處理「什麼時候建立?什麼時候銷毀?哪些執行緒需要建立?」的一系列問題。

threadlocal是乙個資料結構,是乙個hashmap,每個執行緒在用到的時候會例項化。

具體用法很簡單,我們只需要在全域性宣告乙個threadlocal變數。然後所有執行緒最開始訪問這個變數的時候,都只會返回null,而之後對這個變數賦值後,有且只有當前執行緒能夠訪問和修改上一次賦的值。

知道了這個定義後,下面就是羅列考點了。

每乙個執行緒物件thread 內部都有乙個

threadloalmap引用,在首次使用的地方會被初始化(其實就在threadlocal例項get()的時候)。

threadloalmap就好像是每個執行緒的私有堆空間一樣,只有該執行緒能訪問得到,當你threadlocal例項get()的時候,就會獲取這塊私有執行緒堆空間,他會把threadlocal物件當做key從堆空間獲取該執行緒特殊持有的變數。其實這塊堆空間就是乙個特殊的雜湊表,有什麼特殊之處呢?這是下乙個考察點。

------

和hashmap不同,threadloalmap沒有鍊錶結構,當發生衝突的時候他會在雜湊表上按順序查詢下乙個空位,這意味著,當發生衝突的時候,threadloalmap的插入效率很低,通時查詢效能也很低。(效能這麼渣好想優化他是嗎?)

------

雖然key被儲存在weakreference中,weakreference是弱引用,在外部沒有強引用的情況下可以被gc,但是可惡的在於entry對value進行了強引用,所以即使外部沒有強引用,value依然得不到釋放導致記憶體洩漏。

所以在用完threadlocal後你還是得乖乖的使用 threadlocal.set(null);或者 threadlocal.remove();  對threadlocal物件進行記憶體釋放,否則就會記憶體洩漏了。

threadlocal這也是使用時候必須記住的要點。

軟考系列2 技術

一 e r圖關係模式的轉換 邢玉 簡介 資料庫中關鍵的一步 關係模式轉換。掏心窩兒的乾貨,你值得擁有。二 軟考路上 作業系統 胡玉洋 簡介 自考中遇到的作業系統,軟考又聚頭。作者從多個方面全面系統地總結了作業系統的相關知識,有圖有真相,邏輯清晰,思想深刻。希望能帶給您一片作業系統的晴空。三 軟考 程...

軟考總結 物件導向技術

物件導向一直貫穿著我們學習,從剛開始的迷迷糊糊 懵懵懂懂,後來學習又深入了解了一些,再次接觸學習起來更為系統一些,這些還是偏理論上多一點,以後還要多多實踐。簡略 詳細 注 我們之前接觸的uml圖有九種,在軟考課本中介紹了13種,多了通訊圖 組合結構圖 互動概覽圖 計時圖。建立型 5個 乙個人 單例模...

關於threadlocal的來龍去脈

對tls更簡單的,但是更直觀的理解可以如下 基於c語言 1.全域性物件,全域性變數的作用域和生命週期是全域性的,這裡的全域性是指程序範疇,也就是說,如果你將其設計為全域性物件,全域性變數,就意味著你希望在多執行緒的環境中,仍然能共享和訪問。全域性物件,全域性變數不是說不讓多執行緒來訪問,而是說有的時...