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
。