java ThreadLocal簡介與原理

網上看到很多ThreadLocal的文章,感覺上來就開始講原理,根本不講這是個啥。當然可能他們都知道這是個什麼東西,用在什麼場景下,爲什麼需要它出現;而我不知道……

 

ThradLocal是什麼

還是借用別人的說法:

(1)ThreadLocal是一個本地線程副本變量工具類。主要用於將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,在高併發場景下,可以實現無狀態的調用,特別適用於各個線程依賴不同的變量值完成操作的場景。

(2)ThreadLocal類似“人手一支筆”,分別寫自己的東西,互不干擾;但是所有線程寫的名字是一樣的。

爲什麼需要ThreadLocal

我理解應該是有兩個需求:

(1)同一個線程中上下文之間數據共享

(2)不同線程之間數據隔離

首先,如果想要實現一個線程中上下文之間數據共享,那麼設置一個全局變量就可以了。局部變量絕對是不行的,無法做到全局共享。

但是,如果要做到不同線程之間還要數據隔離,這個就有點難了。本身是全局變量,多個線程是有可能會訪問同一個變量的,這個時候ThreadLocal的功能就出來了。本身ThreadLocal這個變量是全局共享變量,各個線程都可以訪問到;但是,不同線程get到的value卻是不一樣的,這就做到了隔離。很好的思路!

使用場景,參考文章https://segmentfault.com/a/1190000019952281

 

ThreadLocal的原理

這個時候開始講TheadLocal的原理纔是合理的。

網上已經有很多文章寫的很好了,我就不重複了。記錄一篇比較好的文章https://www.jianshu.com/p/98b68c97df9b

當然也有些文章寫的有問題,比如

(1)ThreadLocal維護了一個線程安全的map。

這是純扯淡……  map是Thread的成員變量,每個線程維護了一個map,key是ThreadLocal對象,value是值。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章