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