ConcurrentHashMap(JDK1.8)为什么要放弃Segment

今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是如ReentranLock这样的可重入锁?

我想从下面几个角度讨论这个问题:

  1. 锁的粒度
    首先锁的粒度并没有变粗,甚至变得更细了。每当扩容一次,ConcurrentHashMap的并发度就扩大一倍。
  2. Hash冲突
    JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment -> HashEntry)能够快速的找到查找的元素。在1.8中通过链表加红黑树的形式弥补了put、get时的性能差距。
  3. 扩容
    JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。

下面是我对面试中的那个问题的一下看法:

为什么是synchronized,而不是可重入锁
1. 减少内存开销
假设使用可重入锁来获得同步支持,那么每个节点都需要通过继承AQS来获得同步支持。但并不是每个节点都需要获得同步支持的,只有链表的头节点(红黑树的根节点)需要同步,这无疑带来了巨大内存浪费。
2. 获得JVM的支持
可重入锁毕竟是API这个级别的,后续的性能优化空间很小。
synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。这就使得synchronized能够随着JDK版本的升级而不改动代码的前提下获得性能上的提升。


我不能保证写的东西完全正确
但是我能保证我写的东西都是经过思考之后所得出,而不是复制粘贴得来
如果有不对的地方,希望您能够指正,谢谢~

1. Segment 数量 在 JDK1.7 中 ConcurrentHashMap 内部的 Segment 数组的长度是固定的,由一个常量指定,即 16。每个 Segment 可以被看作是一个小的 ConcurrentHashMap。在 JDK1.8 中,Segment 被取消了,取而代之的是一个名为 Node 的数组,这个数组的长度是可变的,它的长度被初始化为 2 的幂次方,具体的大小取决于当前 ConcurrentHashMap 中元素的数量。 2. 数据结构 在 JDK1.7 中 ConcurrentHashMap 内部的每个 Segment 由一个 HashEntry 数组和一个 HashEntry 链表组成。当多个线程同时访问 ConcurrentHashMap 时,它们只会定对应的 Segment,而不是整个 ConcurrentHashMap。在 JDK1.8 中,每个 Node 是一个单独的元素,它可以包含多个 key-value 对,每个 Node 之间通过链表进行关联。 3. 的优化 在 JDK1.8 中,ConcurrentHashMap 中使用了 CAS 操作来进行的优化。在 JDK1.7 中,ConcurrentHashMap 中需要使用来保证线程安全,这个是对每个 Segment 进行的,也就是说,在多线程访问 ConcurrentHashMap 时,每个线程只能同时访问不同的 Segment,这样可以避免的竞争,提高了并发性能。 4. 数据存储方式 在 JDK1.7 中 ConcurrentHashMap 中的数据存储方式是数组和链表结合的方式,其中数组是用来存储数据的,链表是用来解决哈希冲突的。而在 JDK1.8ConcurrentHashMap 中的数据存储方式是数组和链表以及红黑树结合的方式,当链表长度大于 8 时,链表会自动转化为红黑树,这样可以提高查找效率。 5. 性能 由于 JDK1.8ConcurrentHashMap 中使用了 CAS 操作来进行的优化,因此在并发性能方面有了很大的提升。同时,在数据存储方式方面,JDK1.8ConcurrentHashMap 中使用了红黑树来优化哈希冲突,这样可以提高查找效率。因此,JDK1.8ConcurrentHashMap 的性能比 JDK1.7 中 ConcurrentHashMap 更加出色。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值