ThreadLocal用於提供線程的局部變量,在多線程環境裏,每個線程的局部變量獨立於其他線程的局部變量。也就是說 ThreadLocal 可以爲每個線程創建一個【單獨的變量副本】,相當於線程的 private static 類型變量。
ThreadLocal 的作用和同步機制有些相反:同步機制是爲了保證多線程環境下數據的一致性;而 ThreadLocal 是保證了多線程環境下數據的獨立性。
舉個例子,看代碼:
public static void main(String[] args) {
string="main";
threadLocal.set("main");
Thread thread =new Thread(new Runnable() {
public void run() {
string="thread";
threadLocal.set("thread");
System.out.println("子線程的string變量值爲:"+string);
System.out.println("子線程的threadLocal變量值爲:"+threadLocal.get());
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主線程的string變量值爲:"+string);
System.out.println("主線程的threadLocal變量值爲:"+threadLocal.get());
}
}
在上面的類中有兩個變量,一個是普通的String變量,一個是ThreadLocal類型的變量,分別在主線程和子線程中給它們賦值,結果如下:
從結果中可以看到普通的String變量在不同的線程中會被改變,也就是多個線程對於這個變量有相互間的影響,而ThreadLocal類型的變量則保證了多個線程之間變量的獨立性。