concurrentHashMap源码略读
由于项目中常用的集合是hashMap和conCurrentHashMap,hashMap的源码之前已经写过 ,今天看下conCurrentHashMap的存取和两者之间的一些比较。
conCurrentHashMap(jdk1.7和1.8的变化)
在jdk1.7以及之前ConcurrentHashMap采用的是Segment+HashEntry的分段锁策略进行设计的 ,Segment继承 了可重入锁,在1.8中改变了这一设计 将HashEntry改为和HashMap一样的Node节点 作为基本变量 还是数组+链表+红黑树的设计手法。
在这张图片 的注释中可以看到 在一个hash槽存放8个节点的可能性为小于百万分之一,所以节点个数一般按7为分界线 将小于7(小于6退化为链表),大于等于8存放到红黑树中。
首先根据传入的key进行hash运算找到对应的链表节点或者说红黑树节点(都是用Node存的) 对当前链表节点进行判断key,如果key和key'的hash运算都是相同的 ,那就说明是要替换掉这个值 如代码中,直接将值进行更新,否则 将整个节点替换到当前节点的next。在此之前首先要先判断是否要进行扩容 以为concurrentHasmap和HashMap一样有加载因子和初始容量。
helpTransfer这个方法是进行重组的方法 往里看的话 再存入节点的循环中也对节点加了synchronized进行加锁处理,保证并发状态下的线程安全。 因为HashMap线程不安全也是因为存值的时候扩容有可能导致链表的内循环。
取值相对简单 跟hashMap差别不大,读取值不需要加锁。
有个疑问是为什么ConcurrentHashMap不使用Lock进行加锁 而是使用synchronized?
concurrentHashMap源码略读相关推荐
- ConcurrentHashMap源码分析(2)——JDK1.8的实现
ConcurrentHashMap源码分析(1)--JDK1.7的实现 前言 在JDK1.7版本上,ConcurrentHashMap还是通过分段锁来实现的,Segment的数量制约着并发量.在JDK ...
- ConcurrentHashMap源码分析(1)——JDK1.7的实现
ConcurrentHashMap源码分析 ConcurrentHashMap源码分析(2)--JDK1.8的实现 前言 ConcurrentHashMap是线程安全且高效的HashMap的实现,在并 ...
- JDK8中ConcurrentHashMap源码解析
在介绍ConcurrentHashMap源码之前,首先需要了解以下几个知识 1.JDK1.8中ConcurrentHashMap的基本结构 2.并发编程的三个概念:可见性,原子性,有序性 3.CAS( ...
- ConcurrentHashMap源码学习
ConcurrentHashMap源码学习 自从学习了AQS之后,想着重新读一下ConcurrentHashMap的源码来加深下理解,所以有了这篇文章,针对ConcurrentHashMap常用的方法 ...
- ConcurrentHashMap源码剖析(1.8版本)
目录 ConcurrentHashMap源码剖析 数据结构 Node ForwardingNode TreeNode TreeBin 核心成员 核心函数 ConcurrentHashMap(int i ...
- 面试官系统精讲Java源码及大厂真题 - 16 ConcurrentHashMap 源码解析和设计思路
16 ConcurrentHashMap 源码解析和设计思路 与有肝胆人共事,从无字句处读书. 引导语 当我们碰到线程不安全场景下,需要使用 Map 的时候,我们第一个想到的 API 估计就是 Con ...
- JDK1.8 中 ConcurrentHashMap源码分析(一)容器初始化
上一篇文章中说到如何使用IDEA搭建JDK1.8阅读学习环境,JDK1.8源码下载及获取.导入IDEA阅读.配置JDK源码.这篇文章将学习ConcurrentHashMap源码
- ConcurrentHashMap源码跟踪记录
2019独角兽企业重金招聘Python工程师标准>>> concurrentHashMap源码解读 主要理解几个问题1 ConcurrentHashMap如何实现分段锁2 存取数据是 ...
- ConcurrentHashMap源码分析,轻取面试Offer(一)
ConcurrentHashMap 这里主要分析的 jdk1.8中的ConcurrentHashMap,他是java之父Doug Lea之作,很多优秀的开源框架如tomcat.spring.中都大量用 ...
最新文章
- 纪念:2006年我在51CTO的第一帖
- 如何用python画出中国地图-用Python画一个中国地图
- 如何在win2003下安装sql2008[多次安装sql2008失败者必看]
- 如何使用TensorFlow对象检测API播放Quidditch
- python使用函数目的_Python函数的概念和使用
- MFC中如何将焦点设置到指定控件上
- 用vs.net 调试传统ASP程序
- 趣学 C 语言(四)—— 字符串与字符数组
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(15)之前台网站页面
- veevalidate的使用3.X版本
- MSYS2 安装和配置
- 《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
- java流程图怎么画_计算机流程图怎么画
- 均匀半空间视电阻率MATLAB代码,均匀半空间中心回线瞬变电磁法正演研究
- 请仔细核对自己的信息
- dwc_pcie iip 代码分析
- 宣化科技职业学院计算机哪个校区,宣化科技职业学院宿舍怎么样
- CPU卡的一个发卡详细过程
- 完整 Python中切片说明 arr [start: end: step] (arr [-1]、arr[:-1]、arr [::-1] 等的区别)
- MySQL 出现数据库表被锁解决方案