ConcurrentHashMap和HashMap

下面是从jdk1.8的源码中的截图,可以得出ConcurrentHashMap是基于 ReentrantLock (AQS) 加上synchronized以及CAS实现的:

也基于segment数组和hashentry数组,被称为分段加锁(比如链中的node)

这也是区别于hashtables的单纯的synchronized效率更高的原因!

那么什么是AQS请参考下面的链接:

java并发编程框架AQS源码

 resize的解决方法就是其中之一:cas

 同时解决了hashmap线程安全问题:产生循环链表的问题,那么循环链表怎么产生的呢?

多线程同时put时,如果同时调用了resize操作,这个过程就会产生循环链表,代码证明:

产生循环链表的hashmap代码验证

在HashMap扩容时,会改变链表中的元素的顺序,将元素从链表头部插入

简要解释:扩容会存在顺序变化,比如之前是0--->A-->B-->NULL

一个线程进行(头插法)扩容了导致  B-->A     由于另外一个线程刚好进行到 a-->b所以这时候循环链表就出现了!a--b--a

后续完善待

参考链接:

循环链表如何产生的?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ConcurrentHashMapHashMap都是Java中常用的Map数据结构,但它们在实现和使用上有一些不同。 ConcurrentHashMap在JDK 1.7中的实现结构包括Segment(锁数组)、hashEntry(哈希数组)和链表(hashEntry节点)。Segment是对整个桶数组进行了分段,每个Segment都维护了一个独立的锁,这样不同的线程可以同时访问不同的Segment,从而提高了并发性能。hashEntry是存储实际键值对的数组,而链表则是用来解决哈希冲突的。 而HashMap则没有对整个桶数组进行分段,也没有使用锁来保证并发安全。它的底层实现结构只包括hashEntry和链表。在单线程环境下,HashMap的性能通常比ConcurrentHashMap好,因为它没有额外的并发控制开销。 当多个线程同时对ConcurrentHashMap进行操作时,每个线程只需要获取自己所对应的Segment的锁,这样不同线程之间的并发性能更高。而HashMap在多线程环境下,如果没有外部同步控制,可能会出现数据不一致的情况。 引用提供了ConcurrentHashMap在JDK 1.7中的实现结构。 引用提供了使用new()方法创建ConcurrentHashMap的示例。 引用提到了HashMap没有对整个桶数组进行分段的特点。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [HashMapConcurrentHashMap](https://blog.csdn.net/jdk819/article/details/119846649)[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: 50%"] - *3* [ConcurrentHashMapHashMap的区别](https://blog.csdn.net/qq_46130027/article/details/130905598)[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: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

specialApe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值