Java 併發 - ThreadLocal 類



ThreadLocal 類用於建立執行緒區域性變數,這些變數只能由同一個執行緒讀取和寫入。例如,如果兩個執行緒訪問包含對同一個 ThreadLocal 變數的引用的程式碼,那麼每個執行緒都不會看到其他執行緒對 ThreadLocal 變數所做的任何修改。

ThreadLocal 方法

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

序號 方法及描述
1

public T get()

返回當前執行緒在此執行緒區域性變數的副本中的值。

2

protected T initialValue()

返回當前執行緒在此執行緒區域性變數的“初始值”。

3

public void remove()

刪除當前執行緒在此執行緒區域性變數的值。

4

public void set(T value)

將當前執行緒在此執行緒區域性變數的副本設定為指定值。

示例

以下 TestThread 程式演示了 ThreadLocal 類的一些方法。在這裡,我們使用了兩個計數器變數,一個是普通變數,另一個是 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: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0

您可以看到 counter 的值被每個執行緒遞增,但 threadLocalCounter 對於每個執行緒都保持為 0。

廣告