ConcurrentHashMap

ConcurrentHashMap底层原理:

ConcurrentHashMap底层数据结构和HashMap差不多 ,而在产生Hash冲突时使用synchronized加锁来 和CAS模式来保证线程的安全!

 CAS + synchronized + Node + 红黑树

ConcurrentHashMap的重要属性:

private transient volatile int sizeCtl;
当sizeCtl当为负数时,-1 表示正在初始化,-N 表示 N - 1 个线程正在进行扩容;当为 0 时,表示 table 还没有初始化;当为其他正数时,表示初始化或者下一次进行扩容的大小。

构造器:

initialCapacity:表示数组容量 loadFactor 加载因子 concurrencyLevel最大线程 底层保证了initialCapacity>=concurrencyLevel并且 loadFactor是2的次方倍。
并发度:程序运行时能够同时更新 ConccurentHashMap 且不产生锁竞争的最大线程数。默认为 16,且可以在构造函数中设置。当用户设置并发度时,ConcurrentHashMap 会使用大于等于该值的最小2幂指数作为实际并发度(假如用户设置并发度为17,实际并发度则为32)

public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel) {if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)throw new IllegalArgumentException();if (initialCapacity < concurrencyLevel)   // Use at least as many binsinitialCapacity = concurrencyLevel;   // as estimated threadslong size = (long)(1.0 + (long)initialCapacity / loadFactor);int cap = (size >= (long)MAXIMUM_CAPACITY) ?MAXIMUM_CAPACITY : tableSizeFor((int)size);this.sizeCtl = cap;}

put() 方法

流程:

1、如果没有初始化,就调用 initTable() 方法来进行初始化;
2、如果没有 hash 冲突就直接 CAS 无锁插入;
3、如果需要扩容,就先进行扩容;
4、如果存在 hash 冲突,就加锁来保证线程安全,两种情况:一种是链表形式就直接遍历到尾端插入,一种是红黑树就按照红黑树结构插入;
5、如果该链表的数量大于阀值 8,就要先转换成红黑树的结构,break 再一次进入循环
6、如果添加成功就调用 addCount() 方法统计 size,并且检查是否需要扩容。

扩容机制:

扩容时机:

(1) 元素个数达到扩容阈值。
(2) 调用 putAll 方法,但目前容量不足以存放所有元素时。
(3) 某条链表长度达到8,但数组长度却小于64时。
注意:桶上链表长度达到 8 个或者以上,并且数组长度为 64 以下时只会触发扩容而不会将链表转为红黑树 。

扩容过程:

构建一个nextTable,大小为table的两倍。
把table的数据复制到nextTable中。
注意:在复制过程支持多线程复制

Hashtable和 ConcurrentHashMap的区别:

hashtable和ConcurrentHashMap都是线程安全的 ,但是Hashtable是通过在修改数据时锁住整个HashTable,效率较低 而ConcurrentHashMap是通过原子性的操作保证数据的读取安全,然后再通过发生Hash冲突一个给这个数组位置加锁,锁的力度较小来保证 高并发下的线程安全的,而且他的扩容也是支持多线程扩容的,效率较高,Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

ConcurrentHashMap介绍相关推荐

  1. 大三、研二的秋招备战路线(Java、大数据)

    本文经授权转载自微信公众号:大数据肌肉猿 一.写作背景 二.秋招的意义 三.不同水平的同学备战秋招的策略(案例) 四.部分面试题整理 五.准备过程中的注意事项 六.针对简历复习 一.写作背景 1.分享 ...

  2. 美团一面(时间1.10h)

    1. 聊项目 对这个模块进行单机部署,没有搭建集群 Map,单机部署是可以的, 重启之后数据数据之后数据怎么恢复 页面静态化 key:就是一个标识,名字 存的是html页面 预热指的是再用户服务器启动 ...

  3. 面经:阿里一面自我剖析---Java岗(40分钟)

    这里说明一下我是投的阿里淘系技术部,至今已经面了阿里四面,四次都是电话面试,面试体验都很好,即使问到你不是很了解的方面了,面试官会给一些引导,甚至也会悉心给你讲解. 我是8月22号下午一面的,一面面试 ...

  4. 【读书笔记】Java并发编程的艺术

    第一章 并发编程的挑战 上下文切换 上下文切换概述 切出:一个线程被剥夺处理器的使用权而暂定运行 切入:一个线程被选中占用处理器或者继续运行 上下文:在这种切入切出的过程中,操作系统需要保存和恢复相应 ...

  5. 个人春招记录贴,从年初的简历海投到现在的美团offer,我想告诉你的是这些......

    前言 本贴为总结自己的春招历程时,将个人面试经验总结下来,原帖请 点这里 . 有些面试后及时整理了面经,有些没有,因此贴出部分面试经验. 字节 自我介绍 介绍研究方向 讲讲简历论文分别是做了什么 算法 ...

  6. Java多线程系列之“JUC集合“详解

    Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...

  7. 字节跳动一二三面面经-后台开发岗

    一面 介绍下HashMap原理,介绍下红黑树,怎么变为线程安全,锁机制 介绍下JVM 介绍下MySQL,B+树,存储引擎 你的博客的登陆是怎么实现的 不使用redis存储session该怎么做 有两个 ...

  8. Java怎么实现大的map_关于Java中的ConcurrentHashMap的实现原理有大神可以详细介绍下吗?...

    1)相对于HashTable 整个加锁的形式,采用了分段加锁的方式,只有hash值在同一个段中的数据才会发生竞争,如果分n段,理论上最高的并发度也是n. 2)分析get操作 比较一下HashTable ...

  9. java并发编程——并发容器类介绍

    2019独角兽企业重金招聘Python工程师标准>>> 并发容器的简单介绍 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步 ...

最新文章

  1. php mysql 编程原理_PHP开发的原理及优势介绍
  2. 盘点机器学习和统计模型的差异
  3. python 技术篇-使用logging日志模块自定义时间格式
  4. zemax迈克尔逊干涉仪_zemax非序列模式概述-棱镜的色散与迈克尔逊干涉仪016
  5. django默认数据库sqlite3改为mysql
  6. 从Java程序员进阶为架构师,全套16张图概括最全技能!建议收藏!
  7. OpenCV中绘制外围矩形框和圆框
  8. Day 20:网络编程(1)
  9. 如何从文件名字符串中获取文件扩展名_Linux操作系统:文件系统的功能和命名...
  10. 常用设计模式之单例模式
  11. linux安装 soapui_SOAP测试工具-SoapUI For Linux下载V5.2.1免费版-西西软件下载
  12. Class 2 搭建简历网站
  13. smss lsass http://laji.xrlyy.com病毒解决办法
  14. “以图搜图”引擎及网站合集
  15. 《商业分析实践指南》(一)
  16. oracle remap schema,oracle 10g DATA PUMP 的REMAP_SCHEMA和REMAP_TABLESPACE的功能
  17. obs多推流地址_如何用OBS将腾讯会议推流到一直播上进行直播
  18. JavaScript百炼成仙 1.15 天秀
  19. Flink系列之Flink集群搭建
  20. 自动驾驶相关技术网址汇总

热门文章

  1. 推荐系统resys小组线下活动见闻2009-08-22
  2. Swift标准库源码阅读笔记 - Array和ContiguousArray
  3. Git远程操作详解【转】
  4. 深圳惠程澄清与奇虎360公司重组传闻
  5. JavaScript事件对象
  6. 两次include一个文件的问题
  7. codeforces MUH and Cube Walls
  8. 正则表达式中模式修正符作用详解(i、g、m、s、x、e)
  9. VS2013安装OpenCV4.1版本并搭建一个小程序
  10. VLC播放器web插件接口(Part2)