首页 > 其他分享 >JDK1.7和JDK1.8中concurrentHashMap的区别

JDK1.7和JDK1.8中concurrentHashMap的区别

时间:2022-10-18 10:15:37浏览次数:41  
标签:concurrentHashMap 加锁 JDK1.8 JDK1.7 链表 HashEntry Segment

一、JDK1.8 和 JDK1.7的几个区别:

数据结构:取消了Segment分段锁的数据结构,取而代之的是数组+链表+红黑树的结构。

保证线程安全机制:JDK1.7采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock。JDK1.8采用CAS+Synchronized保证线程安全。

锁的粒度:原来是对需要进行数据操作的Segment加锁,现调整为对每个数组元素加锁(Node)。

定位结点的hash算法简化,会带来弊端:Hash冲突加剧。因此在链表节点数量大于8时,会将链表转化为红黑树进行存储。

查询时间复杂度:从原来的遍历链表O(n),变成遍历红黑树O(logN)。

插入节点:JDK1.7是链表头,JDK1.8是链表尾。

二、ConCurrentHashMap 1.8 相比 1.7的话,主要改变为:

去除 Segment + HashEntry + Unsafe 的实现,
改为 Synchronized + CAS + Node + Unsafe 的实现
其实 Node 和 HashEntry 的内容一样,但是HashEntry是一个内部类。
用 Synchronized + CAS 代替 Segment ,这样锁的粒度更小了,并且不是每次都要加锁了,CAS尝试失败了在加锁。

put()方法中 初始化数组大小时,1.8不用加锁,因为用了个 sizeCtl 变量,将这个变量置为-1,就表明table正在初始化。

三、底层数据结构区别:

<jdk1.7>:数组(Segment) + 数组(HashEntry) + 链表(HashEntry节点)

Node数组+链表 / 红黑树: 类似hashMap<jdk1.8>

参考资料:

https://blog.csdn.net/xiaoqi44325234/article/details/104734354

 

标签:concurrentHashMap,加锁,JDK1.8,JDK1.7,链表,HashEntry,Segment
From: https://www.cnblogs.com/northli/p/16801636.html

相关文章

  • ConcurrentHashMap源码,看我这篇就够了
    思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进......
  • ConcurrentHashMap源码,看我这篇就够了
    持续创作,加速成长!这是我参与「掘金日新计划·10月更文挑战」的第5天,点击查看活动详情思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用s......
  • 【精品】windows下JDK1.8+MySQL8.X 安装运行 Seata1.5.2
    网上看到了很多seata的讲解,就我搜到的内容来看:要么是版本太低,要么是前置条件没有交待清楚,要么是讲解的不清不楚,为了节省同学们学习摸索的时间,所以写了该篇博客。环境Wind......
  • JDK1.8新增日期时间api LocalDate LocalTime LocalDateTime
    JDK1.0中使用java.util.Dte类---》第一次日期时间APIJDK1.1引入Calendar类---》第二批日期时间API缺陷:可变性:像日期和时间这样的类应该是不可变的便宜性:Date中的年份是......
  • ConcurrentHashMap底层原理
    5.6ConcurrentHashMap底层原理5.6.1jdk1.75.6.1.1数组结构数据结构是数组+segment对象,采用segment分段锁和CAS保证并发。5.6.1.2put操作流程/***Co......
  • Caused by: java.lang.UnsatisfiedLinkError: /root/jdk1.7.0_45/jre/lib/amd64/xawt/
    在一些linux环境中,尤其是server版中如果工程中使用了图片生成功能,在tomcat启动过程可能会出现如下错误Causedby:java.lang.UnsatisfiedLinkError:/root/jdk1.7.0_45/jre......
  • JDK1.8之日期类
    jdk8通过发布新的Date-TimeAPI(JSR310)来进一步加强对日期与时间的处理,新增了很多常见的api,如==日期的比较,加减,格式化等操作线程安全的日期类核心类名称描......
  • 今日学习Dos命令、计算机语言、jdk1.8安装
    Dos命令#cmd盘符切换将c盘切换到D输入D:#cmd查看当前目录下文件dir#切换目录cdchangedirectory例如E:\>cdF:#清理屏幕cls(clearscreen)#退出终端exit......
  • 翻了ConcurrentHashMap1.7 和1.8的源码,我总结了它们的主要区别。
    ConcurrentHashMap思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独......
  • linux安装jdk1.8
    下载安装包https://www.oracle.com/java/technologies/downloads/在usr下新建java文件夹cd/usrmkdirjavacdjava下载好的安装包放到刚创建的java下jdk-8u341-li......