zoukankan      html  css  js  c++  java
  • Map-ConcurrentHashMap在JDK1.7和1.8区别

    主要设计上的变化有以下几点:

    1、不采用segment而采用node,锁住node来实现减小锁粒度。

    2、 设计了MOVED状态 当resize的中过程中 线程2还在put数据,线程2会帮助resize。

    3、使用3个CAS操作来确保node的一些操作的原子性,这种方式代替了锁。

    4、sizeCtl的不同值来代表不同含义,起到了控制的作用。

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

    JDK7中的ConcurrentHashmap主要使用Segment来实现减小锁粒度,把HashMap分割成若干个Segment,在put的时候需要锁住Segment,get时候不加锁,使用volatile来保证可见性,当要统计全局时(比如size),首先会尝试多次计算modcount来确定,这几次尝试中,是否有其他线程进行了修改操作,如果没有,则直接返回size。如果有,则需要依次锁住所有的Segment来计算。

    jdk7中ConcurrentHashmap中,当长度过长碰撞会很频繁,链表的增改删查操作都会消耗很长的时间,影响性能,所以jdk8 中完全重写了concurrentHashmap,代码量从原来的1000多行变成了 6000多 行,实现上也和原来的分段式存储有很大的区别。

    主要设计上的变化有以下几点:

    1、不采用segment而采用node,锁住node来实现减小锁粒度。

    2、 设计了MOVED状态 当resize的中过程中 线程2还在put数据,线程2会帮助resize。

    3、使用3个CAS操作来确保node的一些操作的原子性,这种方式代替了锁。

    4、sizeCtl的不同值来代表不同含义,起到了控制的作用。

    至于为什么JDK8中使用synchronized而不是ReentrantLock,我猜是因为JDK8中对synchronized有了足够的优化吧。

  • 相关阅读:
    bit byte哪些事
    各种字符集和编码详解
    常用工具大全
    表单提交的3种方式,http post的contentType
    主动发电
    Hibernate与 MyBatis的比较
    storm简介
    2013年十大免费云空间排行榜-给开发者建站用的免费云主机
    中国著名讲师全录
    iptables只允许指定ip地址访问指定端口
  • 原文地址:https://www.cnblogs.com/cxfly/p/10540938.html
Copyright © 2011-2022 走看看