- 相關推薦
Java并發編程:深入剖析ThreadLocal
ThreadLocal類可以理解為ThreadLocalVariable(線程局部變量),提供了get與set等訪問接口或方法,這些方法為每個使用該變量的線程都存有一份獨立的副本,因此get總是返回當前執行線程在調用set時設置的最新值。可以將ThreadLocal
概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
模擬ThreadLocal
復制代碼 代碼如下:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class SimpleThreadLocal
private Map
.synchronizedMap(new HashMap
public void set(T newValue) {
valueMap.put(Thread.currentThread(), newValue); // ①鍵為線程對象,值為本線程的變量副本
}
public T get() {
Thread currentThread = Thread.currentThread();
T o = valueMap.get(currentThread); // ②返回本線程對應的變量
if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起來。
o = initialValue();
valueMap.put(currentThread, o);
}
return o;
}
public void remove() {
valueMap.remove(Thread.currentThread());
}
protected T initialValue() {
return null;
}
}
實用ThreadLocal
復制代碼 代碼如下:
class Count {
private SimpleThreadLocal
@Override
protected Integer initialValue() {
return 0;
}
};
public Integer increase() {
count.set(count.get() + 1);
return count.get();
}
}
class TestThread implements Runnable {
private Count count;
public TestThread(Count count) {
this.count = count;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <= 3; i++) {
System.out.println(Thread.currentThread().getName() + "t" + i
+ "tht" + count.increase());
}
}
}
public class TestThreadLocal {
public static void main(String[] args) {
Count count = new Count();
Thread t1 = new Thread(new TestThread(count));
Thread t2 = new Thread(new TestThread(count));
Thread t3 = new Thread(new TestThread(count));
Thread t4 = new Thread(new TestThread(count));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
輸出
復制代碼 代碼如下:
Thread-0 1th 1
Thread-0 2th 2
Thread-0 3th 3
Thread-3 1th 1
Thread-1 1th 1
Thread-1 2th 2
Thread-2 1th 1
Thread-1 3th 3
Thread-3 2th 2
Thread-3 3th 3
Thread-2 2th 2
Thread-2 3th 3
【Java并發編程:深入剖析ThreadLocal】相關文章:
java教程之Java編程基礎12-03
Java語言的編程特點03-18
Java編程學習示例04-03
Java編程語言應用的行業03-18
java面向對象編程講解04-02
深入理解java的反射04-02
Java語言編程基礎知識04-18
Java編程節省內存的方法12-16
Java編程常見問題匯總12-04