Map實現執行緒安全的3種方式
我們常用的HashMap不是執行緒安全的,如果要實現執行緒安全有3種方式,分別是使用
HashTable
,使用Colloections的SynchronizedMap
方法,使用ConcurrentHashMap
。
1. HashTable
Map<String, Object> map = new Hashtable<>();
來看看HashTable的原始碼。
public synchronized V put(K key, V value) {
...
}
public synchronized V get(Object key) {
...
}
HashTable的get/put方法都被synchronized關鍵字修飾,說明它們是方法級別阻塞的,它們佔用共享資源鎖,所以導致同時只能一個執行緒操作get或者put,而且get/put操作不能同時執行,所以這種同步的集合效率非常低,一般不建議使用這個集合。
2. SynchronizedMap
Map<String, Object> map = Collections.synchronizedMap(new HashMap<String, Object>());
這種是直接使用工具類裡面的方法建立SynchronizedMap,把傳入進行的HashMap物件進行了包裝同步而已,來看看它的原始碼。
private static class SynchronizedMap<K,V>
implements Map<K,V>, Serializable {
private final Map<K,V> m; // Backing Map
final Object mutex; // Object on which to synchronize
SynchronizedMap(Map<K,V> m) {
this.m = Objects.requireNonNull(m);
mutex = this;
}
public V get(Object key) {
synchronized (mutex) {return m.get(key);}
}
public V put(K key, V value) {
synchronized (mutex) {return m.put(key, value);}
}
...
}
SynchronizedMap的實現方式是加了個物件鎖,每次對HashMap的操作都要先獲取這個mutex的物件鎖才能進入,所以效能也不會比HashTable好到哪裡去,也不建議使用。
3. ConcurrentHashMap
Map<String, Object> map = new ConcurrentHashMap<>();
這個也是最推薦使用的執行緒安全的Map,也是實現方式最複雜的一個集合,每個版本的實現方式也不一樣,在jdk8之前是使用分段加鎖的一個方式,分成16個桶,每次只加鎖其中一個桶,而在jdk8又加入了紅黑樹和CAS演算法來實現。
雖然實現起來很複雜,但使用起來也是非常簡單的,在java面試中問的頻率也非常高,最重要的是效能要比上面兩種同步方式要快太多,推薦使用。
相關文章
- Java實現多執行緒的三種方式Java執行緒
- 3種方式實現python多執行緒併發處理Python執行緒
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- Java建立多執行緒的幾種方式實現Java執行緒
- 關於多執行緒的兩種實現方式執行緒
- Java多執行緒之—Synchronized方式和CAS方式實現執行緒安全效能對比Java執行緒synchronized
- Golang map執行緒安全實現及sync.map使用及原理解析。Golang執行緒
- java執行緒實現方式Java執行緒
- java執行緒實現的三種方式以及靜態代理Java執行緒
- Java中實現執行緒的方式Java執行緒
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- Java多執行緒實現方式Java執行緒
- 建立執行緒的三種方式執行緒
- 執行緒建立的四種方式執行緒
- java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒Java執行緒模式
- 多執行緒的三種實現方式及靜態代理模式執行緒模式
- Java中實現執行緒安全HashSet的幾種方法 | baeldungJava執行緒
- 面試-實現多執行緒的方式面試執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- Java中確保執行緒安全最常用的兩種方式Java執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- Java執行緒安全的集合類:Map、List、SetJava執行緒
- 執行緒池建立的幾種方式執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 建立執行緒的方式三:實現Callable介面執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- Python實現執行緒安全佇列Python執行緒佇列
- Java建立多執行緒的四種方式Java執行緒
- java各種集合的執行緒安全Java執行緒
- 匿名內部類方式實現執行緒的建立執行緒
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- 構建穩固基石:C++執行緒安全Map的簡單實現與應用C++執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Java多執行緒【三種實現方法】Java執行緒