ThreadLocal的設計與使用(原理篇)
在jdk1.2推出時開始支援java.lang.ThreadLocal。在J2SE5.0中的宣告為:
public class ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());public Object get() {
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread)) {
o = initialValue();
values.put(curThread, o);
}
return o;
}public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}public Object initialValue() {
return null;
}
}
get()
和 set()
操作都需要values
對映表上的同步,而且如果多個執行緒同時訪問同一個ThreadLocal
,那麼將發生衝突。此外,這個實現也是不切實際的,因為用Thread
物件做 values
對映表中的key將導致無法線上程退出後對 Thread
進行垃圾回收,而且也無法對死執行緒的 ThreadLocal
的特定於執行緒的值進行垃圾回收。從j2sdk5.0的src來看,並非在ThreadLocal中有一個Map,而是在每個Thread中存在這樣一個Map,具體是ThreadLocal.ThreadLocalMap。當用set時候,往當前執行緒裡面的Map裡 put 的key是當前的ThreadLocal物件。而不是把當前Thread作為Key值put到ThreadLocal中的Map裡。public class SerialNum {
// The next serial number to be assigned
private static int nextSerialNum = 0;private static ThreadLocal serialNum = new ThreadLocal() {
protected synchronized Object initialValue() {
return new Integer(nextSerialNum++);
}
};public static int get() {
return ((Integer) (serialNum.get())).intValue();
}
}
當然ThreadLocal並不能替代同步機制,兩者面向的問題領域不同。同步機制是為了同步多個執行緒對相同資源的併發訪問,是為了多個執行緒之間進行通訊的有效方式;而ThreadLocal是隔離多個執行緒的資料共享,從根本上就不在多個執行緒之間共享資源(變數),這樣當然不需要對多個執行緒進行同步了。所以,如果你需要進行多個執行緒之間進行通訊,則使用同步機制;如果需要隔離多個執行緒之間的共享衝突,可以使用ThreadLocal,這將極大地簡化我們的程式,使程式更加易讀、簡潔。
若轉載請註明出處!若有疑問,請回復交流!
相關文章
- ThreadLocal的設計理念與作用thread
- ThreadLocal的正確使用與原理thread
- ThreadLocal的設計優點在哪?thread
- ThreadLocal的使用thread
- Java 併發程式設計:ThreadLocal 的使用及其原始碼實現Java程式設計thread原始碼
- Java併發程式設計—ThreadLocalJava程式設計thread
- 併發程式設計之:ThreadLocal程式設計thread
- Java併發程式設計 -- ThreadLocalJava程式設計thread
- Java併發程式設計——ThreadLocalJava程式設計thread
- 執行緒本地ThreadLocal的介紹與使用!執行緒thread
- ThreadLocal難以在非同步程式設計或Reactive程式設計中使用 - bsideupthread非同步程式設計ReactIDE
- Java併發程式設計:ThreadLocal的使用以及實現原理解析Java程式設計thread
- 玩轉 PHP 網路程式設計之原理篇PHP程式設計
- Java中的引用與ThreadLocalJavathread
- Java併發程式設計:深入剖析ThreadLocalJava程式設計thread
- 詳解apollo的設計與使用
- ThreadLocal的使用場景分析thread
- 簡單學:併發程式設計之 ThreadLocal程式設計thread
- 併發程式設計之 ThreadLocal 原始碼剖析程式設計thread原始碼
- 使用phoenix踩的坑與設計思考
- 讀《程式設計師跳槽全攻略》摘抄或想法 - 原理篇程式設計師
- Java ThreadLocal 使用詳解Javathread
- ThreadLocal在java web工程中的使用。threadJavaWeb
- Java:設計與使用迭代器薦Java
- XMNetworking 網路庫的設計與使用
- JAVA設計模式 1 設計模式介紹、單例模式的理解與使用Java設計模式單例
- ThreadLocal 使用手冊 | 按需收藏thread
- ThreadLocal概念以及使用場景thread
- 面試中的 ThreadLocal 原理和使用場景面試thread
- 使用ThreadLocal變數的時機和方法thread變數
- ThreadLocal與ThreadLocalMap原始碼分析thread原始碼
- ThreadLocal與ThreadLocalMap原始碼解析thread原始碼
- 億級使用者中心的設計與實踐
- Weex 學習與實踐(三):iOS 原理篇iOS
- 在 dubbo 中使用 Threadlocal 的相關問題thread
- Threadlocal的使用以及實現原理總結thread
- ThreadLocal 原理和使用場景分析thread
- 機器學習——原理篇機器學習