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多 行,实现上也和原来的分段式存储有很大的区别。

扫描二维码关注公众号,回复: 5550095 查看本文章

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

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/cxfly/p/10540938.html
今日推荐