激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java 中ConcurrentHashMap的實現

Java 中ConcurrentHashMap的實現

2020-06-14 11:12Giraffe JAVA教程

本文主要介紹Java 中ConcurrentHashMap的實現,這里整理了詳細的資料,及簡單實例代碼,有興趣的小伙伴可以參考下

ConcurrentHashMap(簡稱CHM)是在Java 1.5作為Hashtable的替代選擇新引入的,是concurrent包的重要成員。在Java 1.5之前,如果想要實現一個可以在多線程和并發的程序中安全使用的Map,只能在HashTable和synchronized Map中選擇,因為HashMap并不是線程安全的。但再引入了CHM之后,我們有了更好的選擇。CHM不但是線程安全的,而且比HashTable和synchronizedMap的性能要好。相對于HashTable和synchronizedMap鎖住了整個Map,CHM只鎖住部分Map。CHM允許并發的讀操作,同時通過同步鎖在寫操作時保持數據完整性。我們已經在Top 5 Java Concurrent Collections from JDK 5 and 6中學習了CHM的基礎知識,在這篇博客中我將介紹以下幾點:

  1. CHM在Java中如何實現的
  2. 什么情況下應該使用CHM
  3. 在Java中使用CHM的例子
  4. CHM的一些重要特性

Java中ConcurrentHashMap的實現

CHM引入了分割,并提供了HashTable支持的所有的功能。在CHM中,支持多線程對Map做讀操作,并且不需要任何的blocking。這得益于CHM將Map分割成了不同的部分,在執行更新操作時只鎖住一部分。根據默認的并發級別(concurrency level),Map被分割成16個部分,并且由不同的鎖控制。這意味著,同時最多可以有16個寫線程操作Map。試想一下,由只能一個線程進入變成同時可由16個寫線程同時進入(讀線程幾乎不受限制),性能的提升是顯而易見的。但由于一些更新操作,如put(),remove(),putAll(),clear()只鎖住操作的部分,所以在檢索操作不能保證返回的是最新的結果。

另一個重要點是在迭代遍歷CHM時,keySet返回的iterator是弱一致和fail-safe的,可能不會返回某些最近的改變,并且在遍歷過程中,如果已經遍歷的數組上的內容變化了,不會拋出ConcurrentModificationExceptoin的異常。

CHM默認的并發級別是16,但可以在創建CHM時通過構造函數改變。毫無疑問,并發級別代表著并發執行更新操作的數目,所以如果只有很少的線程會更新Map,那么建議設置一個低的并發級別。另外,CHM還使用了ReentrantLock來對segments加鎖。

Java中ConcurrentHashMap putifAbsent方法的例子

很多時候我們希望在元素不存在時插入元素,我們一般會像下面那樣寫代碼

?
1
2
3
4
5
6
7
synchronized(map){
 if (map.get(key) == null){
  return map.put(key, value);
 } else{
  return map.get(key);
 }
}

上面這段代碼在HashMap和HashTable中是好用的,但在CHM中是有出錯的風險的。這是因為CHM在put操作時并沒有對整個Map加鎖,所以一個線程正在put(k,v)的時候,另一個線程調用get(k)會得到null,這就會造成一個線程put的值會被另一個線程put的值所覆蓋。當然,你可以將代碼封裝到synchronized代碼塊中,這樣雖然線程安全了,但會使你的代碼變成了單線程。CHM提供的putIfAbsent(key,value)方法原子性的實現了同樣的功能,同時避免了上面的線程競爭的風險。

什么時候使用ConcurrentHashMap

CHM適用于讀者數量超過寫者時,當寫者數量大于等于讀者時,CHM的性能是低于Hashtable和synchronized Map的。這是因為當鎖住了整個Map時,讀操作要等待對同一部分執行寫操作的線程結束。CHM適用于做cache,在程序啟動時初始化,之后可以被多個請求線程訪問。正如Javadoc說明的那樣,CHM是HashTable一個很好的替代,但要記住,CHM的比HashTable的同步性稍弱。

總結

現在我們知道了什么是ConcurrentHashMap和什么時候該用ConcurrentHashMap,下面我們來復習一下CHM的一些關鍵點。

  1. CHM允許并發的讀和線程安全的更新操作
  2. 在執行寫操作時,CHM只鎖住部分的Map
  3. 并發的更新是通過內部根據并發級別將Map分割成小部分實現的
  4. 高的并發級別會造成時間和空間的浪費,低的并發級別在寫線程多時會引起線程間的競爭
  5. CHM的所有操作都是線程安全
  6. CHM返回的迭代器是弱一致性,fail-safe并且不會拋出ConcurrentModificationException異常
  7. CHM不允許null的鍵值
  8. 可以使用CHM代替HashTable,但要記住CHM不會鎖住整個Map

以上就是Java中CHM的實現和使用場景,希望能幫助到大家!謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩av有码在线 | 国产资源在线播放 | 久久人人爽人人爽人人片av高请 | 一区二区三区四区在线观看视频 | 369看片你懂的小视频在线观看 | 日本道中文字幕 | 黄色毛片免费视频 | 黄色片观看| 国产精品久久久久久久av | 在线日韩亚洲 | 91精品国产91久久久久久不卞 | 凹凸成人精品亚洲精品密奴 | 91高清完整版| 欧美久久久一区二区三区 | 国产成人高清在线 | 久久影院一区二区三区 | 亚a在线| 黄视频在线网站 | 一区二区三区四区国产 | 视频一区二区三区在线播放 | 伊人99在线| 羞羞的视频在线免费观看 | 麻豆视频观看 | 国产免费一区二区三区 | 九九热在线视频观看 | 欧美一级全黄 | 九九热在线视频观看 | 成人免费观看在线视频 | 黄色网址在线视频 | 在线播放亚洲精品 | 怦然心动50免费完整版 | 日日碰日日操 | www.guochanav.com| 欧美日韩亚洲精品一区二区三区 | 国产亚洲精品综合一区 | 国产精品亚洲yourport | 一区视频| 久久精品毛片 | 毛片在线免费播放 | 国产精品av久久久久久久久久 | 亚洲最黄视频 |