一:作用
ThreadLocal其實(shí)就是一個(gè)變量,比如String,Integer,你可以進(jìn)行指定。比如現(xiàn)在全局有個(gè)內(nèi)置Integer的ThreadLocal。你可以開(kāi)啟多個(gè)線(xiàn)程,每個(gè)線(xiàn)程都對(duì)這個(gè)變量進(jìn)行set,get,他們都是互不沖突的。(相當(dāng)于每個(gè)線(xiàn)程都有自己的一份拷貝,修改這個(gè)值對(duì)其他線(xiàn)程里的這個(gè)變量沒(méi)有影響)。
經(jīng)典的使用場(chǎng)景是為每個(gè)線(xiàn)程分配一個(gè) JDBC 連接 Connection。這樣就可以保證每個(gè)線(xiàn)程的都在各自的 Connection 上進(jìn)行數(shù)據(jù)庫(kù)的操作,不會(huì)出現(xiàn) A 線(xiàn)程關(guān)了 B線(xiàn)程正在使用的 Connection; 還有 Session 管理 等問(wèn)題。
二:簡(jiǎn)單使用
創(chuàng)建一個(gè)Integer類(lèi)型的ThreadLocal

三:方法

四:實(shí)現(xiàn)原理
看一個(gè)set方法,200行寫(xiě)獲取當(dāng)前的線(xiàn)程t。然后201行時(shí)得到一個(gè)ThreadLocalMap的變量。通過(guò)名字就看出來(lái)了,其實(shí)就是通過(guò)當(dāng)前線(xiàn)程得到一個(gè)值的映射。然后進(jìn)行set操作。
點(diǎn)開(kāi)getMap方法,返回的是一個(gè)線(xiàn)程的變量,點(diǎn)開(kāi)這個(gè)變量我們就會(huì)跳轉(zhuǎn)到Thread.java文件里面,說(shuō)明每一個(gè)線(xiàn)程都有一個(gè)threadLocals對(duì)象。


五:簡(jiǎn)單原理總結(jié):
TheadLocal是一個(gè)泛型類(lèi),保證可以接受任何類(lèi)型的Object。每個(gè)線(xiàn)程內(nèi)部都會(huì)維護(hù)一個(gè)ThreadLocalMap,這個(gè)map的key是弱引用。
如果都沒(méi)有手動(dòng)刪除對(duì)應(yīng)key,都會(huì)導(dǎo)致內(nèi)存泄漏。
所以將線(xiàn)程的threadlocalmap里對(duì)應(yīng)的key設(shè)置成弱引用。引用ThreadLoacl的引用沒(méi)有了,即使沒(méi)有手動(dòng)刪除,這個(gè)key也會(huì)被設(shè)置成null,然后value下次調(diào)用get、set、remove的時(shí)候都會(huì)刪除key=null的value。