程式設計師需要知道ThreadLocal的這幾個點

2021-10-09 17:00:52 字數 1385 閱讀 1609

threadlocal是什麼呢?在實際開發中經常被用來繫結使用者資訊、日誌號。資料庫連線等等。這樣一來,我們編碼時就不用通過傳遞引數方式而影響業務邏輯。就如名字一般,我們可以簡單的認為它的作用就是把資料繫結到當前執行緒上,然後用於後續的操作。

既然是將資料繫結到當前執行緒上,那最方便高效的資料儲存方式就是key-value的hash方式儲存了。不過不同於hashmap的實現方式,它單獨提供了乙個叫做threadlocalmap的map類,與hashmap有著類似的功能,但是區別是它的key使用弱引用(只要gc掃瞄到,只有弱引用的情況下就會被**)。

static

class

threadlocalmap

}}

為什麼threadlocalmap和hashmap的key不同,會設計成弱引用呢?我們來分析一下:

由於使用了弱引用,就有可能造成網上經常說的記憶體洩露?(其實感覺沒有恐怖)我們先說這個記憶體洩漏是怎麼產生的呢?如下圖:

圖上我們可以看到當threadlocal的例項如果設定為null,那麼之後例項會被**。這個時候threadlocal,也就是threadlocalmap的key僅有乙個弱引用了,說明gc時key會被**。當**後我們就會發現v這個值就被留在了map當中了,我們無法獲取,也無法刪除。這就是所謂的記憶體洩露問題。

不過我們也發現只要執行緒銷毀後,threadlocalmap也會被**就解決了執行緒洩露的問題。但是如果執行緒長時間存活那就麻煩了。還有一種情況就是在使用執行緒池的時候。我們都知道執行緒池裡的執行緒都是復用的,那麼當設定了threadlocal的執行緒沒有清除之前設定資料的話,就很可能造成之後復用執行緒的時候使用錯誤資料。所以,threadlocal類提供了乙個解綁資料的方法remove方法。

public

void

remove()

}

threadlocal 方便程式設計時將資料繫結到當前執行緒上,而不用方法傳遞引數,只需在需要使用時從threadlocal獲取資料即可。threadlocal中的threadlocalmap的key使用了弱引用,方便執行緒在長時間存活的情況下,及時清理gc只有弱引用的key值,一定程度上降低堆疊溢位的風險。但同時由於弱引用的使用,帶來了執行緒洩露的風險,以及在資料庫執行緒池場景下使用造成資料錯誤的風險。這就要求每個程式設計師在使用threadlocal結束後,及時使用remove方法(即使有些地方不remove也沒有風險,但是寫了就不會考慮這考慮那了,畢竟還有很多**等著你)。

程式設計師OR非程式設計師,有些程式設計的事需要知道

我們的日常生活深受軟體和web開發的影響。越來越多的人意識到了軟體的重要性,例如,假如你想前往巴西看世界盃,你應該首先在網上預訂機票,訂機票時應該用你的信用卡支付費用,成功預訂機票後,你的電子郵箱會收到乙個電子機票。當你到達機場時,你的身份證資訊會被移民資料庫系統檢測,當這些都ok了,登機飛往巴西。...

程式設計師OR非程式設計師,有些程式設計的事需要知道

程式設計師or非程式設計師,有些程式設計的事需要知道 我們的日常生活深受軟體和web開發的影響。越來越多的人意識到了軟體的重要性,例如,假如你想前往巴西看世界盃,你應該首先在網上預訂機票,訂機票時應該用你的信用卡支付費用,成功預訂機票後,你的電子郵箱會收到乙個電子機票。當你到達機場時,你的身份證資訊...

程式設計師要知道的事情

程式設計師是乙個神奇的職業 我們工作的時候給公司帶來很高的利益,我們自己也要給自己產生價值。下面一些事情可以提高我們程式設計師,所以我們要認真的看一下。不喜勿噴 1.經常和優秀的人在一起共事 和一些老鳥在一起工作,對你有很大的提公升。比如我經常看老鳥們操作liunx系統,那命令敲的那就乙個快啊 很羨...