page contents

ConcurrentHashMap疑问

Pack 发布于 2020-02-28 17:54
阅读 771
收藏 0
分类:Java开发

跟1.7相比,在1.8中做了优化。

1.8的put方法中,假如数组某个位置上有一个元素,再新增一个节点,那么锁住头节点,就只有一个线程能处理该链表。如下图(1.8)。在1.7中,因为元素是segment类型的,本身是lock,那么不管之前位置上有没有元素,都是锁住该位置,同一时刻只有一个线程处理。

就只考虑上面说的情况,不考虑其他红黑树的优化,我认为在1.8中还是分段锁的思想,并没有得到什么多大的优化。因为不管锁住的是数组的某个位置还是锁住头节点,同一时刻都只能一个线程操作对应的链表。请问我这样的理解是否正确?

attachments-2020-02-EcHsqCdw5e58e336245c5.png

484
Pack
Pack

1.7和1.8锁的范围明显不一样,1.7的锁的范围要比1.8的更大。


如果不好理解,你看一下1.7的存储结构图

attachments-2020-02-aDetZ6Gg5e58e359156f9.png


既然课堂上分析了ConcurrentHashMap1.8的源码,为何不尝试自己去分析一下?学习能力才是最重要的!

请先 登录 后评论