并發集合常見的有ConCurrentHashMap,ConcurrentllinkedQueue,ConcurrentLinkedDeque等,并發集合位于Java.util.concurrent包下,是JDK5之后有的。
在Java中有普通集合,同步(線程安全)的集合,并發集合,普通集合通常性能最高,但是不保證多線程的安全行和并發的可靠性,線程安全集合僅僅是給集合添加了synchronize同步鎖,嚴重犧牲了性能,而且對并發的效率就更低了,并發集合則通過復雜的策略不僅保證了多線程的安全又提高了并發時的效率。
## **ConcurrentHashMap**
ConcurrentHashMap是線程安全的HashMap實現,默認構造同樣有initalCapacity和loadFactor屬性,不過還多了一個concurrencyLevel屬性,三屬性的默認值分別是16、0.75及16。其內部使用鎖分段技術,維持這鎖Segment的數組,在Segment數組中又存放著Entity[]數組,內部hash算法將數據較均勻分部在不同鎖中。
**put方法**
在ConcurrentHashMap中并沒有給put方法加上synchronize,首先是對key.hashcode進行hash操作,得到key的hash值。hash操作的算法和map也不同,根據此hash值計算并獲取到其對應數組內的segment對象,在根據segme對象調用put方法來完成操作。
<br/>
concurrentHashMap基于concurrencylevel劃分出了多個Segme來對key-value進行存儲,從而避免每次put操作都要鎖住整個數組,在默認情況下,最佳的情況可允許16個線程并發無阻塞的操作集合對象,盡可能的減少并發時造成的阻塞情況<br/>
**get**
同樣也沒在方法上加synchronize,首先對key.hashcode進行Hash操作,基于其值找到對應的Segment對象,調用get方法完成當前操作,而Segment的get方法首先通過hash值和對象數組大小減1的值進行按位與操作來獲取數組上對應位置的HashEntity。在這個步奏中,可能會因為對象數組大小的改變,以及數組上對應位置的HashEntity產生不一致性,那么ConcurrentHashMap是如何實現的:
對象數組大小的改變只有在put操作時有可能發生,由于HashEntity對象數組對應的變量是volatile類型的,因此可以保證如HashEntity對象數組大小發生改變,讀操作可看到最新的對象數組大小。
在讀取到了HashEntity對象后,怎么能保證它及其next屬性構成鏈表上的對象不會改變呢?
- JDK常用知識庫
- JDK各個版本安裝
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 選擇排序
- 插入排序
- 歸并排序
- 快速排序
- 堆排序
- 希爾排序
- 計數排序
- 桶排序
- 基數排序
- 總結
- 常用工具類
- 浮點型計算
- 時間格式處理
- 常用功能點思路整理
- 登錄
- 高并發
- 線程安全的單例模式
- Tomcat優化
- Tomcat之APR模式
- Tomcat啟動過慢問題
- 常用的數據庫連接池
- Druid連接池
- 緩存
- Redis
- SpringBoot整合Redis
- 依賴和配置
- RedisTemplate工具類
- 工具類使用方法
- Redis知識庫
- Redis安裝
- Redis配置參數
- Redis常用Lua腳本
- MongoDB
- SpringBoot操作MongoDB
- 依賴和配置
- MongoDB工具類
- 工具類使用方法
- 消息中間件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定時任務
- 啟動加載
- 事務
- JSP
- 靜態類注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陸驗證
- 權限驗證
- 分布式應用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 刪
- 改
- 查
- 程序員小笑話
- 我給你講一個TCP的笑話吧
- 二進制笑話
- JavaScript的那點東西
- JavaScript內置對象及常見API詳細介紹
- JavaScript實現Ajax 資源請求
- JavaScript干貨
- 架構師成長之路
- JDK源碼解析
- ArrayList源碼解讀
- 設計模式
- 微服務架構設計模式
- 逃離單體煉獄
- 服務的拆分策略
- 全面解析SpringMvc框架
- 架構設計的六大原則
- 并發集合
- JUC并發編程
- 搜索引擎
- Solr
- Solr的安裝
- 分布式服務框架
- Dubbo
- 從零開始學HTMl
- 第一章-初識HTML
- 第二章-認識HTML標簽