面試必問-幾種執行緒安全的Map解析
HashMap執行緒安全的嗎?
Java中平時用的最多的Map集合就是HashMap了,它是執行緒不安全的。
看下面兩個場景:
1、當用在方法內的區域性變數時,區域性變數屬於當前執行緒級別的變數,其他執行緒訪問不了,所以這時也不存線上程安全不安全的問題了。
2、當用在單例物件成員變數的時候呢?這時候多個執行緒過來訪問的就是同一個HashMap了,對同個HashMap操作這時候就存線上程安全的問題了。
執行緒安全的Map
為了避免出現場景2的執行緒安全的問題,不能使用HashMap作為成員變數,要尋求使用執行緒安全的Map,下面來總結下有哪些執行緒安全的Map呢?
1、HashTable
privateMapmap=newHashtable<>();
來看看HashTable的原始碼
HashTable的get/put方法都被synchronized關鍵字修飾,說明它們是方法級別阻塞的,它們佔用共享資源鎖,所以導致同時只能一個執行緒操作get或者put,而且get/put操作不能同時執行,所以這種同步的集合效率非常低,一般不建議使用這個集合。
2、SynchronizedMap
privateMapmap= Collections.synchronizedMap(newHashMap());
這種是直接使用工具類裡面的方法建立SynchronizedMap,把傳入進行的HashMap物件進行了包裝同步而已,來看看它的原始碼。
這個同步方式實現也比較簡單,看出SynchronizedMap的實現方式是加了個物件鎖,每次對HashMap的操作都要先獲取這個mutex的物件鎖才能進入,所以效能也不會比HashTable好到哪裡去,也不建議使用。
3、ConcurrentHashMap - 推薦
privateMapmap=newConcurrentHashMap<>();
這個也是最推薦使用的執行緒安全的Map,也是實現方式最複雜的一個集合,每個版本的實現方式也不一樣,在jdk8之前是使用分段加鎖的一個方式,分成16個桶,每次只加鎖其中一個桶,而在jdk8又加入了紅黑樹和CAS演算法來實現。
雖然實現起來很複雜,但使用起來也是非常簡單的,在java面試中問的頻率也非常高,最重要的是效能要比上面兩種同步方式要快太多,推薦使用。
相關文章
- Map實現執行緒安全的3種方式執行緒
- 面試官問我:建立執行緒有幾種方式?我笑了面試執行緒
- Golang map執行緒安全實現及sync.map使用及原理解析。Golang執行緒
- 執行緒的幾種狀態執行緒
- 你真正瞭解UI執行緒更新的幾種方式嗎—面試必備之深度揭祕UI執行緒面試
- Java中實現執行緒安全HashSet的幾種方法 | baeldungJava執行緒
- 自動生成代替interface的執行緒安全map執行緒
- Java執行緒安全的集合類:Map、List、SetJava執行緒
- Java提供的幾種執行緒池Java執行緒
- JAVA 執行緒的幾種狀態Java執行緒
- 執行緒池建立的幾種方式執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- Java併發Map的面試指南:執行緒安全資料結構的奧秘Java面試執行緒資料結構
- Java面試必問之執行緒池的建立使用、執行緒池的核心引數、執行緒池的底層工作原理Java面試執行緒
- Java執行緒池8大拒絕策略,面試必問!Java執行緒面試
- 多執行緒面試題之多執行緒有幾種實現方案,分別是什麼執行緒面試題
- iOS中保證執行緒安全的幾種方式與效能對比iOS執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- 執行緒的幾種狀態總結執行緒
- java各種集合的執行緒安全Java執行緒
- ArrayList 的執行緒安全問題執行緒
- go 1.9 多執行緒安全MAP 函式模組Go執行緒函式
- Java面試之Java中實現多執行緒有幾種方法Java面試執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- 為什麼 Go map 和 slice 是非執行緒安全的?Go執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- JDk1.7 HashMap原始碼解析——執行緒安全問題JDKHashMap原始碼執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- java執行緒安全問題Java執行緒
- 03 執行緒安全問題執行緒
- android 建立多執行緒的幾種方法Android執行緒
- Java 多執行緒 學習筆記(二)停止執行緒的幾種方法Java執行緒筆記
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 執行緒安全使用 HashMap 的四種技巧執行緒HashMap
- parallelStream中的執行緒安全問題Parallel執行緒
- 所謂的執行緒安全問題執行緒