3、Concurrenthashmap实现原理(JDK版本1.7)
(1)结构图:

l ConcurrentHashMap中的数据结构
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment实际继承自可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,每个Segment里包含一个HashEntry数组,我们称之为table,每个HashEntry是一个链表结构的元素。

l ConcurrentHashMap实现原理或者ConcurrentHashMap如何在保证高并发下线程安全的同时实现了性能提升?
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,只要多个修改操作发生在不同的段上,它们就可以并发进行。
l ConcurrentHashMap初始化
初始化有三个参数
initialCapacity:初始容量大小 ,默认16。
loadFactor, 扩容因子,默认0.75,当一个Segment存储的元素数量大于initialCapacity* loadFactor时,该Segment会进行一次扩容。
concurrencyLevel 并发度,默认16。并发度可以理解为程序运行时能够同时更新ConccurentHashMap且不产生锁竞争的最大线程数,实际上就是ConcurrentHashMap中的分段锁个数,即Segment[]的数组长度。如果并发度设置的过小,会带来严重的锁竞争问题;如果并发度设置的过大,原本位于同一个Segment内的访问会扩散到不同的Segment中,CPU cache命中率会下降,从而引起程序性能下降。
l put(K key, V value)
1、首先定位segment,当这个segment在map初始化后,还为null,由ensureSegment方法负责填充这个segment。
对Segment 加锁

3、定位所在的table元素,并扫描table下的链表,找到时:

没有找到时:

l 扩容操作
Segment 不扩容,扩容下面的table数组,每次都是将数组翻倍

好处是:可以快速定位和减少重排次数
l size()方法
size的时候进行两次不加锁的统计,两次一致直接返回结果,不一致,重新加锁再次统计
3、Concurrenthashmap实现原理(JDK版本1.7)的更多相关文章
- CentOS 6.5移除openJDK及JDK安装环境变量配置及JDK版本切换
一.查找已经安装的open JDK [root@localhost ~]# rpm -qa|grep jdk java--openjdk-.el6_3.x86_64 java--openjdk-1.7 ...
- Unsupported major.minor version 51.0(jdk版本错误)
解决方案: 步骤一: 在“项目”点右键->选择Perperties->在出现的菜单中选择Java Compiler->最上面选中Enable project Specific set ...
- HashMap和ConcurrentHashMap实现原理及源码分析
HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表, ...
- jdk 版本切换
由于要创建一个新的项目,启动时报错了,Spring boot 启动报错 Unsupported major.minor version 52.0,是因为jdk版本太低了,从目前是1.7,我已经安装过了 ...
- [转帖]HashMap、HashTable、ConcurrentHashMap的原理与区别
HashMap.HashTable.ConcurrentHashMap的原理与区别 http://www.yuanrengu.com/index.php/2017-01-17.html 2017年1月 ...
- 嘿嘿,我就知道面试官接下来要问我 ConcurrentHashMap 底层原理了,看我怎么秀他
前言 上篇文章介绍了 HashMap 源码后,在博客平台广受好评,让本来己经不打算更新这个系列的我,仿佛被打了一顿鸡血.真的,被读者认可的感觉,就是这么奇妙. 然后,有读者希望我能出一版 Concur ...
- Eclipse开发环境JDK版本问题和校验问题
今天遇到的两个问题: 1.启动程序报错:Unsupported major.minor version 52.0 这是JDK版本过低的问题,统一一下Build Path和java Complie中的版 ...
- tomcat之一:指定tomcat运行时JDK版本
tomcat作为日常开发的web应用服务器,给开发测试带来了很多便利,tomcat的运行依赖JDK的支持,在安装JDK时经常会配置环境变量:JAVA_HOME.CLASSPAT,且需要添加path变量 ...
- IntelliJ IDEA中Maven项目的默认JDK版本
在IntelliJ IDEA 15中使用Maven时,IDEA将默认的编译版本.源码版本设置为jdk5.编译项目的时候出现警告:"Warning:Java: 源值1.5已过时, 将在未来所有 ...
随机推荐
- HTML5Audio/Video全解(疑难杂症)
1.mp4格式视频无法在chrome中播放 Chrome浏览器支持HTML5,它支持原生播放部分的MP4格式(不用通过Flash等插件).为 什么是部分MP4呢?MP4有非常复杂的含义(见http:/ ...
- VS2015 osgEarth 编译
E:\OpenSourceGraph\CURL_install\includeE:\GDAL\includeE:\Geos\geos_3_5_install\includeE:\OpenSourceG ...
- 【设计】PC Web端框架组件
https://uedart.com/demo/templatesWebKit/index.html#g=1&p=%E4%BD%9C%E5%93%81%E9%A6%96%E9%A1%B5 移动 ...
- hadoop在windows上的配置文件
core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <val ...
- 【web 安全测试思路】图形验证码对服务器的影响
前言 图片验证码是为了防止恶意破解密码.刷票.论坛灌水等才出现的,但是你有没有想过,你的图形验证码竟然可能导致服务器的崩溃? 利用过程 这里以phpcms为例,首先需要找一个图形验证码. 将图片拖动到 ...
- java面试考点-面试准备
面试前准备 了解应试公司相关信息及岗位信息 系统复习基础知识 对原公司负责项目进行梳理 阅读常规框架源码 学习典型架构案例 针对招聘文案准备加分项 相关技能 基础知识:进程/线程,TCP协议,HTTP ...
- 不用第三方软件–一键开关笔记本电脑wifi热点的批处理
笔者有点洁癖啊,很强烈抵制那些辣鸡流氓软件的.用笔记本开个wifi还要装东西,搞不好给我塞一堆东西,我勒个fdkshgkhalsh,. 下面就是集设置密码与开关wifi于一身的bat,这个批处理能简化 ...
- DSP VLIB实验
声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些 ...
- 记录:larvel Windows 安装
先安装Composer 不多叙述了 链接: https://pan.baidu.com/s/1sljuImh 密码: qcj3 打开命令窗口 进入你的集成环境 网站根目录下 laravel程序会下载 ...
- 最新 贝壳找房java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.贝壳找房等10家互联网公司的校招Offer,因为某些自身原因最终选择了贝壳找房.6.7月主要是做系统复习.项目复盘.Leet ...