
- 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。
廣告