什麼是ThreadLocal

什麼是ThreadLocal

ThreadLocal是一個本地線程副本變量工具類,各個線程都擁有一份線程私有的數據,線程之間的變量互不干擾,在高併發場景下,可以實現無狀態的調用。

ThreadLocal提供了線程安全的另一種思路,我們平常說的線程安全主要是保證共享數據的併發訪問問題,通過sychronized鎖或者CAS無鎖策略來保證數據的一致性。

對於同一個static ThreadLocal,不同線程只能從中get,set,remove自己的變量,而不會影響其他線程的變量。

1、ThreadLocal.get: 獲取ThreadLocal中當前線程共享變量的值。

  • 從map中獲取線程存儲的K-V Entry節點。
  • 從Entry節點獲取存儲的Value副本值返回。
  • map為空的話返回初始值null,即線程變量副本為null,需要注意的是在使用中要判斷是否為空指針NullPointerException。

2、ThreadLocal.set: 設置ThreadLocal中當前線程共享變量的值。

  • map非空,則重新將ThreadLocal和新的value副本放入到map中。
  • map空,則對線程的成員變量ThreadLocalMap進行初始化創建,並將ThreadLocal和value副本放入map中。

2、ThreadLocal.set: 設置ThreadLocal中當前線程共享變量的值。

3、ThreadLocal.remove: 移除ThreadLocal中當前線程共享變量的值。

4、ThreadLocal.initialValue: ThreadLocal沒有被當前線程賦值時或當前線程剛調用remove方法後調用get方法,返回此方法值。

ThreadLocal的核心機制:

什麼是ThreadLocal

每個Thread線程內部都有一個Map。

Map裡面存儲線程本地對象(key)和線程的變量副本(value)

Thread內部的Map是由ThreadLocal維護的,由ThreadLocal負責向map獲取和設置線程的變量值。

對於不同的線程,每次獲取副本值時,別的線程並不能獲取到當前線程的副本值,形成了副本的隔離,彼此之間互不干擾。


分享到:


相關文章: