【Java并发编程】23、ConcurrentHashMap原理分析…
2018-06-18 01:35:28来源:未知 阅读 ()
jdk 1.8版本
ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了。首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构。而对于锁的粒度,调整为对每个数组元素加锁(Node)。
put的步骤大致如下:
- 参数校验。
- 若table[]未创建,则初始化。table的初始化和扩容采用CAS无锁设计,通过状态 sizeCtl 来控制线程的并发操作:U.compareAndSwapInt(this, SIZECTL, sc, -1)
- 当table[i]后面无节点时,直接创建Node(无锁操作)。也是通过CAS实现:return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v);
- 如果当前正在扩容,则帮助扩容并返回最新table[]。
- 然后在链表或者红黑树中追加节点。此过程通过synchronized (f) 锁定当前node实现线程安全
- 如果是链表,遍历链表,发现相同key则替换旧值,没有发现相同key则添加到链表的末尾
- 如果是红黑树,执行红黑树的插入代码。执行完毕,synchronized (f) 锁退出
- 最后还回去判断是否到达阀值,如到达变为红黑树结构。使用方法:treeifyBin(tab, i);
- treeifyBin(tab, i)方法执行过程:如果容量小于64,直接扩容,不需要转变成红黑树。否则,对链表的头结点加synchronized 锁,以他为根节点构造红黑树
get()方法没有加锁操作,步骤如下:
- 首先定位到table[]中的i。
- 若table[i]存在,则继续查找。
- 首先比较链表头部,如果是则返回。
- 然后如果为红黑树,查找树。
- 如果不是红黑树,循环链表查找。
参考网上的详细说明资料如下:
ConcurrentHashMap的JDK1.8实现
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Object对象你真理解了吗?
下一篇:十分钟搞定mongodb副本集
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
