每一個Thread對象均含有一個ThreadLocalMap類型的成員變量ThreadLocals殉摔,它存儲本線程中所有ThreadLocal對象及其對應的值
ThreadLocal由一個個Entry對象構成
Entry繼承自WeakReference<ThreadLocal<?>>,一個Entry由ThreadLocal對象和Object構成饺律,由此可見,Entry的key是ThreadLocal對象,并且是一個弱引用眉撵。當沒指向key的強引用后,該key就會被垃圾回收器回收
當執(zhí)行set方法時落塑,ThreadLocal首先會獲取當前線程對象纽疟,然后獲取當前線程的ThreadLocalMap對象,再以當前ThreadLocal對象為key憾赁,將值存儲進ThreadLocal對象中污朽。
get方法執(zhí)行過程類似。ThreadLocal首先會獲取當前線程對象龙考,然后獲取當前線程的ThreadLocalMap對象蟆肆,再以當前ThreadLocal對象為key矾睦,獲取對應的value。
由于每一條線程均含有各自私有的ThreadLocalMap容器炎功,這些容器相互獨立互不影響枚冗,因此不會存在線程安全性問題,從而也無需使用同步機制來保證多條線程訪問容器的互斥性蛇损。
使用場景:
- 在使用對象跨層傳遞的時候赁温,使用ThreadLocal可以避免多次傳遞,打破層次間的約束淤齐;
- 線程間數(shù)據(jù)隔離
- 進行事務操作股囊,用于存儲線程事務信息;
- 數(shù)據(jù)庫連接更啄,session會話處理稚疹。
spring框架在事務開始的時候會給當前線程綁定一個jdbc Connection,在整個事務過程中都是使用該線程綁定的connection來執(zhí)行數(shù)據(jù)庫操作祭务,實現(xiàn)的事務的隔離性内狗。spring框架里面就是用的ThreadLocal來實現(xiàn)這種隔離