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