原博文:http://blog.csdn.net/u010723709/article/details/48007881
看了一些博文,总结下(JDK8源码):
1、ConcurrentHashmap 使用的是位桶+链表/红黑树实现,结构与hashmap一样,它摒弃了以前Segment(锁段)的概念,而用了一种新的方式实现,CAS算法实现,并且为了实现并发,加入了如treeBin等辅助类;treeBin并不负责包装用户的key、value信息,而是包装的很多TreeNode节点。它代替了TreeNode的根节点,也就是说在实际的ConcurrentHashMap“数组”中,存放的是TreeBin对象
2、Node节点类中与hashmap不一样的是,在对value和next属性设置了volatile同步锁,不允许调用setValue方法直接改变Node的value域,但增加了find方法。
3、一个重要的属性sizeCtrl用来表示扩容的情况的标识,正数或0代表hash表还没有被初始化,这个数值表示初始化或下一次进行扩容的大小;-1代表正在初始化;-N 表示有N-1个线程正在进行扩容操作。
4、put操作
第一步:初始化,对于ConcurrentHashMap来说,调用它的构造方法仅仅是设置了一些参数而已。而整个table的初始化是在向ConcurrentHashMap中插入元素的时候发生的。如调用put、computeIfAbsent、compute、merge等方法的时候。
第二步:在存入值前,key值hash化,遍历位桶数组,如果发现需要扩容,则首先扩容。构建一个2倍中间的nexttable表,在需要复制的地方,先将一个null节点设置为ForwardingNode,然后加锁,复制内容;其他线程遍历到这个节点时,就会跳过往下一个节点继续遍历,直到复制玩内容,sizeCtrl变成扩容后的0.75n
第三步:如果当前hash没被占用,会被直接存储。如果hash有冲突,若当前节点下为链表,则会依次比对,hash和key都相同,则替换value值;没有就将当前值插入到链表最后,当发现链表长多超过8时,会转成红黑树,但在位桶中存的是TreeBin,TreeBin存放的是TreeNode。如果有冲突且节点下为treeBin时,则按照红黑树查找,存放到相应位置。
5、get操作,get方法比较简单,给定一个key来确定value的时候,必须满足两个条件 key相同 hash值相同,对于节点可能在链表或树上的情况,需要分别去查找。
6、size对于ConcurrentHashMap来说,这个table里到底装了多少东西其实是个不确定的数量,因为不可能在调用size()方法的时候像GC的“stop the world”一样让其他线程都停下来让你去统计,因此只能说这个数量是个估计值,主要运用了mappingCount
分享到:
相关推荐
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
java本地缓存ConcurrentHashMap
Java 7_ConcurrentHashMap.jpg
java源码剖析-ConcurrentHashMap
java7-8中的 HashMap和ConcurrentHashMap全解析 如果你想了解底层的逻辑就来看看吧
主要介绍了Java中遍历ConcurrentHashMap的四种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了深入学习java并发包ConcurrentHashMap源码,整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。,需要的朋友可以参考下
ConcurrentHashMap使用了分段锁(Segment)来实现并发的读写操作,每个Segment都相当于一个小的HashMap,将整个哈希表分成多个部分。这样可以同时进行多个线程的并发读写操作,不会阻塞其他线程的访问。 需要注意的...
Java并发编程之ConcurrentHashMap Java并发编程之ConcurrentHashMap.pdf
哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查 找的值即 key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数 组来实现:将键作为索引...
ConcurrentHashMap源码分析(JDK8版本)注:本文源码是JDK8的版本,与之前的版本有较大差异ConcurrentHashMap是conccur
ConcurrentHashMap的实现原理(JDK1.7和JDK1.8),并说明了在jdk1.7与jdk1.8的不同实现原理
Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发...
java7-8中的 HashMap和ConcurrentHashMap全解析
computeIfAbsent方法会初始化一个ReservationNode来...http://gee.cs.oswego.edu/cgi- bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/ConcurrentHashMap.java?r1=1.258&r2=1.259&sortby=date&diff_format=f
下面小编就为大家带来一篇基于Java并发容器ConcurrentHashMap#put方法解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java concurrency集合之ConcurrentHashMap_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
对JDK8中ConcurrentHashMap的容器初始化、添加元素安全、扩容安全以及多线程情况下扩容效率的提高、集合长度的累计方式以及获取集合长度等这些方法的源码进行了详细的解释说明
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
今天小编就为大家分享一篇关于Java源码解析ConcurrentHashMap的初始化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧