现阶段的学习策略是理解和实践这些知识点,并没有深入分析其原理,但确实精读了许多关于这个主题基础性的资料让我很受益(见参考资料)。
哈希表基础
1.哈希表是基于数组的数据结构
2.通过对关键字的哈希运算实现元素的快速定位
3.哈希表的重点是哈希化,哈希化负责把一个大范围的数字转化成一个小范围的数字
4.哈希化过程中会产生值冲突,这种情况有多种办法可以解决(开放地址法、链地址法)
4.1.开放地址法,通过在哈希表中寻找一个空位解决冲突问题,寻找空位的方法也有多种(线性探测、二次探测、再哈希)
4.2.链地址法,通过在哈希表单元中加入链表的方式解决
5.哈希表的重要缺点
5.1.当存储数组基本被填满时性能下降很高
5.2.对存储数组进行扩容会分别对已存储的元素重新计算哈希的过程
ConcurrentHashMap分段与锁的学习
一、结构
二、定位分段
这块对Key的哈希值进行移位处理,首先给定的Key在哪一段,然后从具体段中定位Hash值对应具体值对象。
三、锁
ConcurrentHashMap没有将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种粒度更细的加锁机制实现更大程度的共享。这种细粒度的加锁机制体现在ConcurrentHashMap划分的Segment数组,Segment数组上各Segment元素代表了粒度更细的锁,从结构图中可以看到Segment继承自ReentrantLock可重入锁。
ConcurrentHashMap这种基于分组Segment并加锁的策略可在高并发的环境下获得更高的吞吐量。
ConcurrentHashMap实现并发的基础操作都通过sun.misc.Unsafe完成。
四、sun.misc.Unsafe
Unsafe类相关于一个工具类,低层调用native方法,提供了基础CompareAndSet(CAS)支持,通过CAS可以在不加锁并发情况下实现数字或引用的细粒度更新。
参考资料
1、Wang/Jenkins Hash算法,http://wangjunle23.blog.163.com/blog/static/11783817120138863910800
2、数据结构和算法2th
3、并发容器,http://www.blogjava.NET/xylz/archive/2010/07/20/326584.html
4、UNSAFE,http://blog.csdn.Net/aesop_wubo/article/details/7537278
5、CAS,http://blog.csdn.net/aesop_wubo/article/details/7537960
6、Java非阻塞,http://www.ibm.com/developerworks/cn/java/j-jtp04186/
相关推荐
NULL 博文链接:https://107192468a.iteye.com/blog/2296911
主要介绍了java ConcurrentHashMap锁分段技术详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
ConcurrentHashMap使用了分段锁(Segment)来实现并发的读写操作,每个Segment都相当于一个小的HashMap,将整个哈希表分成多个部分。这样可以同时进行多个线程的并发读写操作,不会阻塞其他线程的访问。 需要注意的...
本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在...
程序员面试加薪必备_ConcurrentHashMap底层原理与源码分析深入详解
ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的...
java本地缓存ConcurrentHashMap
解析concurrenthashmap的源码,学习多线程的思想
java源码剖析-ConcurrentHashMap
ConcurrentHashMap源码剖析
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
ConcurrentHashMap 使用了分段锁的机制,每个段都独立锁定,提高了并发性能。 HashMap 和 HashTable 的区别 1. 线程安全性:HashMap 是非线程安全的,HashTable 是线程安全的。 2. 键和值的 null 值:HashMap 的键...
1.面向对象的的特征有哪些方面 2.论述类的加载机制 3.对于反射的理解 4.GC是什么?为什么要有GC ...23.ConcurrentHashMap分段式加锁是如何实现 24.HashMap存储null值的底层实现 25.叙述线程的生命周期
ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。
这时候ConcurrentHashMap达到容量扩容而忽略了ReservationNode情况,调用put的时候在synchronized(f)没有对ReservationNode处理,所以会出现死循环。 在jdk1.8和1.9中对比 http://gee.cs.oswego.edu/cgi- bin/...
主要介绍了java 使用ConcurrentHashMap和计数器实现锁的相关资料,需要的朋友可以参考下
涵盖绝大部分HashMap与ConcurrentHashMap的面试题 附带答案
ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。ConcurrentHashMap为了提高本身的并发能力,在内部采用了...
ConcurrentHashMap之实现细节