ThreadLocal是為解決多線程程式的並發問題而提出的,可以稱之為線程局部變數。與一般的變數的區別在於,生命週期是線上程範圍內的。
static變數是的生命週期與類的使用周期相同,即只要類存在,那麼static變數也就存在。
那麼一個 static 的 ThreadLocal會是什麼樣的呢。
看下面一個例子,
public class SequenceNumber { private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){ public Integer initialValue(){ return 0; } }; public int getNextNum(){ seqNum.set(seqNum.get() + 1); return seqNum.get(); } public static void main(String[] args){ SequenceNumber sn = new SequenceNumber(); TestClient t1 = new TestClient(sn); TestClient t2 = new TestClient(sn); TestClient t3 = new TestClient(sn); t1.start(); t2.start(); t3.start(); t1.print(); t2.print(); t3.print(); } private static class TestClient extends Thread{ private SequenceNumber sn ; public TestClient(SequenceNumber sn ){ this.sn = sn; } public void run(){ for(int i=0; i< 3; i++){ System.out.println( Thread.currentThread().getName() + " --> " + sn.getNextNum()); } } public void print(){ for(int i=0; i< 3; i++){ System.out.println( Thread.currentThread().getName() + " --> " + sn.getNextNum()); } } } }
下面是結果
Thread-2 --> 1 Thread-2 --> 2 Thread-2 --> 3 Thread-0 --> 1 Thread-0 --> 2 Thread-0 --> 3 Thread-1 --> 1 Thread-1 --> 2 Thread-1 --> 3 main --> 1 main --> 2 main --> 3 main --> 4 main --> 5 main --> 6 main --> 7 main --> 8 main --> 9
可以發現,static的ThreadLocal變數是一個與線程相關的靜態變數,即一個線程內,static變數是被各個執行個體共同引用的,但是不同線程內,static變數是隔開的