一:作用
ThreadLocal其實就是一個變量盯串,比如String啡彬,Integer杆煞,你可以進行指定。比如現(xiàn)在全局有個內(nèi)置Integer的ThreadLocal蘑险。你可以開啟多個線程滴肿,每個線程都對這個變量進行set,get佃迄,他們都是互不沖突的泼差。(相當(dāng)于每個線程都有自己的一份拷貝贵少,修改這個值對其他線程里的這個變量沒有影響)。
經(jīng)典的使用場景是為每個線程分配一個 JDBC 連接 Connection堆缘。這樣就可以保證每個線程的都在各自的 Connection 上進行數(shù)據(jù)庫的操作滔灶,不會出現(xiàn) A 線程關(guān)了 B線程正在使用的 Connection; 還有 Session 管理 等問題套啤。
二:簡單使用
創(chuàng)建一個Integer類型的ThreadLocal
三:方法
四:實現(xiàn)原理
看一個set方法宽气,200行寫獲取當(dāng)前的線程t。然后201行時得到一個ThreadLocalMap的變量潜沦。通過名字就看出來了萄涯,其實就是通過當(dāng)前線程得到一個值的映射。然后進行set操作唆鸡。點開getMap方法涝影,返回的是一個線程的變量,點開這個變量我們就會跳轉(zhuǎn)到Thread.java文件里面争占,說明每一個線程都有一個threadLocals對象燃逻。
五:簡單原理總結(jié):
TheadLocal是一個泛型類,保證可以接受任何類型的Object臂痕。每個線程內(nèi)部都會維護一個ThreadLocalMap,這個map的key是弱引用伯襟。
如果都沒有手動刪除對應(yīng)key,都會導(dǎo)致內(nèi)存泄漏握童。
所以將線程的threadlocalmap里對應(yīng)的key設(shè)置成弱引用姆怪。引用ThreadLoacl的引用沒有了,即使沒有手動刪除澡绩,這個key也會被設(shè)置成null,然后value下次調(diào)用get稽揭、set、remove的時候都會刪除key=null的value肥卡。