ThreadLocal線程局部變量,實作了将對象變量儲存在特定的線程對象中,僅對目前線程可見。
我們在測試程式中,一個線程往ThreadLocal對象中放置對象,然後另一個對象來取對象取不到。
public class TestThreadLocal {
static ThreadLocal <Person> tl = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Person());
}).start();
}
static class Person {
}
}
檢視ThreadLocal源代碼,可以看到,get()和set()方法都涉及到一個ThreadLocalMap對象,而該對象是在Thread對象中的。

由以上代碼,可以看到,ThreadLocal實作的将對象變量儲存在特定的線程對象的map中,隻對目前線程可見。
應用:
資料庫連接配接
如果多個連接配接資料庫的方法組合為一個事務,則其對應的是統一資料庫的多個連接配接,則其不能保證事物的原子性。而ThreadLocal可以保證目前線程值對應這一個資料庫連接配接。
而且由于資料庫連接配接對象可以使用ThreadLocal存放,省去了不斷釋放和建立連接配接的系統消耗。
記憶體洩漏: