ThreadLocal Thread ThreadLocalMap 之間的關係
阿新 • • 發佈:2020-06-01
`ThreadLocal` :每個執行緒通過此物件都會返回各自的值,互不干擾,這是因為每個執行緒都存著自己的一份副本。需要注意的是執行緒結束後,它所儲存的所有副本都將進行垃圾回收(除非存在對這些副本的其他引用)
`ThreadLocal`的`get`操作是這樣執行的:`ThreadLocalMap map = thread.threadLocals` -> `return map.getEntry(threadLocal)`
`ThreadLocal`的`set`操作是這樣執行的:`ThreadLocalMap map = thread.threadLocals` -> `map.set(threadLocal, value)`
三者的關係是:
- 每個`Thread`對應的所有`ThreadLocal`副本都存放在`ThreadLocalMap`物件中,`key`是`ThreadLocal`,`value`是副本資料
- `ThreadLocalMap`物件存放在`Thread`物件中
- 通過`ThreadLocal`獲取副本資料時,實際是通過訪問`Thread`來獲取`ThreadLocalMap`,再通過`ThreadLocalMap`獲取副本資料
示例程式碼如下:
```java
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors;
/**
* @author: lihui
* @date: 2020-06-01
*/
public class ThreadLocalStudy {
private static final Thr