- Java 併發教程
- 併發 - 首頁
- 併發 - 概述
- 併發 - 環境設定
- 併發 - 主要操作
- 執行緒間通訊
- 併發 - 同步
- 併發 - 死鎖
- 實用類示例
- 併發 - ThreadLocal
- 併發 - ThreadLocalRandom
- 鎖示例
- 併發 - 鎖
- 併發 - 讀寫鎖
- 併發 - 條件
- 原子變數示例
- 併發 - AtomicInteger
- 併發 - AtomicLong
- 併發 - AtomicBoolean
- 併發 - AtomicReference
- 併發 - AtomicIntegerArray
- 併發 - AtomicLongArray
- 併發 - AtomicReferenceArray
- 執行器示例
- 併發 - 執行器
- 併發 - ExecutorService
- ScheduledExecutorService
- 執行緒池示例
- 併發 - newFixedThreadPool
- 併發 - newCachedThreadPool
- newScheduledThreadPool
- newSingleThreadExecutor
- 併發 - ThreadPoolExecutor
- ScheduledThreadPoolExecutor
- 高階示例
- 併發 - Futures 和 Callables
- 併發 - Fork-Join 框架
- 併發集合
- 併發 - BlockingQueue
- 併發 - ConcurrentMap
- ConcurrentNavigableMap
- 併發有用資源
- 併發 - 快速指南
- 併發 - 有用資源
- 併發 - 討論
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。
廣告