探究Java的ConcurrentHashMap实现机制

原文地址: http://blog.csdn.net/u011080472/article/details/51392712


在学习ConcurrentHashMap的高并发时,找到了一些高质量的博客,就没有重复转载了。分别列出了JDK6中的Segment分段加锁机制和JDK8中的CAS无锁算法并发机制。

基于JDK6

在JDK6中ConcurrentHashMap的的并发实现主要利用内部类Segment实现”分段加锁“的思想。ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对;Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。

  1. 程晓明,探索 ConcurrentHashMap 高并发性的实现机制
  2. 方腾飞,聊聊并发(四)——深入分析ConcurrentHashMap

基于JDK8

JDK8的版本,与JDK6的版本有很大的差异。实现线程安全的思想也已经完全变了,它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式实现,但是为了做到并发,又增加了很多辅助的类,例如TreeBin,Traverser等对象内部类。

CAS算法实现无锁化的修改值的操作,他可以大大降低锁代理的性能消耗。这个算法的基本思想就是不断地去比较当前内存中的变量值与你指定的一个变量值是否相等,如果相等,则接受你指定的修改的值,否则拒绝你的操作。因为当前线程中的值已经不是最新的值,你的修改很可能会覆盖掉其他线程修改的结果。这一点与乐观锁,SVN的思想是比较类似的。

  1. ConcurrentHashMap源码分析(JDK8版本)
  2. JAVA CAS原理深度分析
  3. 非阻塞同步算法与CAS(Compare and Swap)无锁算法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8中的ConcurrentHashMap是线程安全的哈希表实现,它支持并发读写操作而不需要全局锁定。它的实现原理主要有以下几个方面: 1. 分段锁策略:ConcurrentHashMap将整个数据结构分成若干个Segment(段),每个Segment维护着一个独立的散列桶数组。每个Segment内部都有一个可重入锁,不同的线程可以同时访问不同的Segment,从而实现并发读写的能力。 2. 散列桶数组:ConcurrentHashMap使用散列桶数组来存储键值对。每个散列桶上都有一个链表,用于解决哈希冲突。当多个键映射到同一个散列桶时,它们会被链接到同一个链表上。 3. CAS操作:ConcurrentHashMap使用CAS(Compare and Swap)操作来保证并发更新操作的原子性。CAS是一种无锁算法,它通过比较内存中的值与期望值是否相等来确定是否更新。如果相等,则执行更新操作;否则,重新尝试。 4. 扩容机制ConcurrentHashMap在插入新元素时,如果当前Segment的负载因子(即链表长度)超过阈值,则会触发扩容操作。扩容时,会创建一个新的散列桶数组,并将原来的键值对重新分配到新的散列桶中。这个过程可以通过加锁来保证线程安全。 总的来说,ConcurrentHashMap通过分段锁策略、散列桶数组、CAS操作和扩容机制实现线程安全的并发读写操作。它在多线程环境下能够提供较好的性能和可伸缩性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值