java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)
  mS9tsoCLUtbF 2023年11月02日 26 0


与1.7相比的重大变化

  1. 取消了segment数组,直接用table保存数据,锁的粒度更小,减少并发冲突的概率。
  2. 存储数据时采用了链表+红黑树的形式,纯链表的形式时间复杂度为O(n),红黑树则为O(logn),性能提升很大。什么时候链表转红黑树?当key值相等的元素形成的链表中元素个数超过8个的时候。

主要数据结构和关键变量

Node类存放实际的key和value值。

sizeCtl:

负数:表示进行初始化或者扩容,-1表示正在初始化,-N,表示有N-1个线程正在进行扩容

正数:0 表示还没有被初始化,>0的数,初始化或者是下一次进行扩容的阈值

TreeNode 用在红黑树,表示树的节点, TreeBin是实际放在table数组中的,代表了这个红黑树的根。

初始化做了什么事?

只是给成员变量赋值,put时进行实际数组的填充

 

在get和put操作中,是如何快速定位元素放在哪个位置的?

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_初始化

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_数组_02

get()方法

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_红黑树_03

put()方法

数组的实际初始化

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_红黑树_04

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_初始化_05

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_数组_06

java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)_数组_07

扩容操作

transfer()方法进行实际的扩容操作,table大小也是翻倍的形式,有一个并发扩容的机制。

size方法

估计的大概数量,不是精确数量

一致性

弱一致

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ltERVYe6WHLK   2023年11月02日   21   0   0 数据类型C#初始化
mS9tsoCLUtbF
最新推荐 更多