ThreadLocal原理分析
阿新 • • 發佈:2020-05-26
##本文結構
- `ThreadLocal`簡介 (簡要說明`ThreadLocal`的作用)
- `ThreadLocal實`現原理(說明`ThreadLocal`的常用方法和原理)
- `ThreadLocalMap`的實現 (說明核心資料結構`ThreadLocalMap`的實現)
## ThreadLocal簡介
------------------------------
先貼一段官方的文件解釋
```
/**
* This class provides thread-local variables. These variables differ from
* their normal counterparts in that each thread that accesses one (via its
* {@code get} or {@code set} method) has its own, independently initialized
* copy of the variable. {@code ThreadLocal} instances are typically private
* static fields in classes that wish to associate state with a thread (e.g.,
* a user ID or Transaction ID).
*/
```
大意是ThreadLocal類提供了一個執行緒的本地變數,每一個執行緒持有一個這個變數的副本並且每個執行緒讀取`get()`到的值是不一樣的,可以通過`set()`方法設定這個值;
**在某些情況下使用ThreadLocal可以避免共享資源的競爭,同時與不影響執行緒的隔離性**。
通過threadLocal.set方法將物件例項儲存在每個執行緒自己所擁有的threadLocalMap中,
這樣每個執行緒使用自己儲存的ThreadLocalMap物件,不會影響執行緒之間的隔離。
看到這裡的第一眼我一直以為ThreadLocal是一個map,每一個執行緒都是一個key,對應一個value,但是是不正確的。正確的是每個執行緒持有一個ThreadLocalMap的副本,這個map的鍵是ThreadLocal物件,各個執行緒中同一key對應的值可以不一樣。
## ThreadLocal實現原理
------------------------------
###`ThreadLocal`中的欄位與構造方法
>
>詳細說明參考註釋
>```
>public class Thr