ThreadLocal是一個(gè)本地線程副本變量工具類,在每個(gè)線程中都創(chuàng)建了一個(gè)ThreadLocalMap對(duì)象,簡(jiǎn)單說(shuō)ThreadLocal就是一種以空間換時(shí)間的做法,每個(gè)線程可以訪問(wèn)自己內(nèi)部ThreadLocalMap對(duì)象內(nèi)的 value。通過(guò)這種方式,避免資源在多線程間共享。
原理:線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個(gè)線程間共享。
Java提供ThreadLocal類來(lái)支持線程局部變量,是一種實(shí)現(xiàn)線程安全的方式。但是在管理環(huán)境下(如 Web服務(wù)器)使用線程局部變量的時(shí)候要特別小心,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長(zhǎng)。
任何線程局部變量一旦在工作完成后沒(méi)有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險(xiǎn)。經(jīng)典的使用場(chǎng)景是為每個(gè)線程分配一個(gè)JDBC連接Connection。這樣就可以保證每個(gè)線程的都在各自的Connection上進(jìn)行數(shù)據(jù)庫(kù)的操作,不會(huì)出現(xiàn)A線程關(guān)了B線程正在使用的Connection; 還有 Session管理等問(wèn)題。