ConcurrentHashMap扩容加锁
时间: 2023-10-14 16:04:18 浏览: 223
java的hashMap多线程并发情况下扩容产生的死锁问题解决.docx
ConcurrentHashMap在扩容时采用了分段加锁的策略,也就是将整个Map分成多个段(Segment),每个段都有自己的锁。每个段维护着一个哈希表,包含多个链表或红黑树。当一个线程需要进行插入、删除或者查找操作时,只需要锁住当前需要操作的段,而不是整个HashMap。这样可以大大提高并发性能。
在JDK 1.8版本中,ConcurrentHashMap使用了synchronized、volatile和CAS(Compare And Swap)的组合来实现对锁的降低粒度。具体来说,每个Segment中的操作使用了synchronized关键字来保证原子性,volatile关键字用于保证可见性,而CAS用于实现乐观锁机制,减少锁的争用。这样一来,多个线程可以同时对不同的段进行操作,提高了并发性能。
至于为什么选择将initialCapacity设置为2的n次幂,这是为了提高HashMap的性能。当initialCapacity的容量是2的n次幂时,可以通过位运算来计算key的hash值对应的桶的索引,这样可以加快定位的速度。而且,当需要进行扩容时,也可以更高效地进行重新分配。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [JavaSE基础面试题.docx](https://download.csdn.net/download/BruceLiu_code/85610232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [又一篇深入分析ConcurrentHashMap的文章](https://blog.csdn.net/caihaijiang/article/details/8219826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [说说ConcurrentHashMap原理与实现](https://blog.csdn.net/jjclove/article/details/124334337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
阅读全文