Java並行ThreadLocal類


ThreadLocal類用於建立只能由同一個執行緒讀取和寫入的執行緒區域性變數。 例如,如果兩個執行緒正在存取參照相同threadLocal變數的程式碼,那麼每個執行緒都不會看到任何其他執行緒操作完成的執行緒變數。

執行緒方法

以下是ThreadLocal類中可用的重要方法的列表。

編號 方法 描述
1 public T get() 返回當前執行緒的執行緒區域性變數的副本中的值。
2 protected T initialValue() 返回此執行緒區域性變數的當前執行緒的「初始值」。
3 public void remove() 刪除此執行緒區域性變數的當前執行緒的值。
4 public void set(T value) 將當前執行緒的執行緒區域性變數的副本設定為指定的值。

範例

以下TestThread程式演示了ThreadLocal類的上面一些方法。 這裡我們使用了兩個計數器(counter)變數,一個是常數變數,另一個是ThreadLocal變數。

class RunnableDemo implements Runnable {
   int counter;
   ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();

   public void run() {     
      counter++;
      if(threadLocalCounter.get() != null){
         threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
      }else{
         threadLocalCounter.set(0);
      }
      System.out.println("Counter: " + counter);
      System.out.println("threadLocalCounter: " + threadLocalCounter.get());
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo commonInstance = new RunnableDemo();

      Thread t1 = new Thread( commonInstance);
      Thread t2 = new Thread( commonInstance);
      Thread t3 = new Thread( commonInstance);
      Thread t4 = new Thread( commonInstance);

      t1.start();
      t2.start();
      t3.start();
      t4.start();

      // wait for threads to end
      try {
         t1.join();
         t2.join();
         t3.join();
         t4.join();
      }catch( Exception e) {
         System.out.println("Interrupted");
      }
   }
}

這將產生以下結果 -

Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 4
Counter: 3
threadLocalCounter: 0
threadLocalCounter: 0

您可以看到變數(counter)的值由每個執行緒增加,但是ThreadLocalCounter對於每個執行緒都保持為0