当我们享受着jdk带来的便利时同样承受它带来的不幸恶果。通过分析Hashtable就知道, synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,慧眼独具的DougLee立马拿出了解决方案----ConcurrentHashMap。

ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图

左边便是Hashtable的实现方式—锁整个hash表;而右边则是ConcurrentHashMap的实现方式—锁桶(或段)。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。试想,原来 只能一个线程进入,现在却能同时16个写线程进入(写线程才需要锁定,而读线程几乎不受限制,之后会提到),并发性的提升是显而易见的。

更令人惊讶的是ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些)。 只有在求size等操作时才需要锁定整个表。而在迭代时, **ConcurrentHash

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】浏览器打开:qq.cn.hn/FTf 免费领取

Map使用了不同于传统集合的快速失败迭代器(见之前的文章《JAVA API备忘—集合》)的另一种迭代方式,我们称为弱一致迭代器。**在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出 ConcurrentModificationException,取而代之的是在改变时new新的数据从而不影响原有的数 据,iterator完成后再将头指针替换为新的数据,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变,更重要的,这保证 了多个线程并发执行的连续性和扩展性,是性能提升的关键。

接下来,让我们看看ConcurrentHashMap中的几个重要方法,心里知道了实现机制后,使用起来就更加有底气。

ConcurrentHashMap中主要实体类就是三个: ConcurrentHashMap(整个Hash表),Segment(桶),HashEntry(节点),对应上面的图可以看出之间的关系。

get 方法(请注意,这里分析的方法都是针对桶的,因为ConcurrentHashMap的最大改进就是将粒度细化到了桶上),首先判断了当前桶的数据个数是 否为0,为0自然不可能get到什么,只有返回null,这样做避免了不必要的搜索,也用最小的代价避免出错。然后得到头节点(方法将在下面涉及)之后就 是根据hash和key逐个判断是否是指定的值,如果是并且值非空就说明找到了,直接返回;程序非常简单,但有一个令人困惑的地方,这句 **return readValueUnderLock(e)**到底是用来干什么的呢?研究它的代码,在锁定之后返回一个值。但这里已经有一句V v = e.value得到了节点的值,这句return readValueUnderLock(e)是否多此一举?事实上,这里完全是 **为了并发考虑的,这里当v为空时,可能是一个线程正在改变节点,而之前的 get操作都未进行锁定,根据bernstein条件,读后写或写后读都会引起数据的不一致,所以这里要对这个e重新上锁再读一遍,以保证得到的是正确值,**这里不得不佩服Doug Lee思维的严密性。整个get操作只有很少的情况会锁定,相对于之前的Hashtable,并发是不可避免的啊!

总结:

1、concurrenthashMap结合了hashtable与hashmap的优点,实现分段锁,使用的锁是ReentrantLock(重入锁)

2、concurrentHashMap 读操作不进行加锁

3、 concurrentHashMap 扩容时不对整个容器扩容,只对segment进行扩容

4、统计map长度时会对整个map的增删改操作进行加锁,所以此时性能会比较低。建议在循环时先拿到长度,不会每次都去重新拿一下

ConcurrentHashMap源码解读,java大厂面试攻略相关推荐

  1. ConcurrentHashMap源码分析,轻取面试Offer(一)

    ConcurrentHashMap 这里主要分析的 jdk1.8中的ConcurrentHashMap,他是java之父Doug Lea之作,很多优秀的开源框架如tomcat.spring.中都大量用 ...

  2. ConcurrentHashMap源码分析,轻取面试Offer(二)

    上篇ConcurrentHashMap源码分析,轻取面试Offer(一)中降到了看源码的方法,下面接上篇继续分析源码 先来上篇注释过的代码段和遗留的问题. final V putVal(K key, ...

  3. HashMap、ConcurrentHashMap源码解读(JDK7/8)

    下载地址(已将图片传到云端,md文件方便浏览更改):https://download.csdn.net/download/hancoder/12318377 推荐视频地址: https://www.b ...

  4. JDK8之ConcurrentHashMap源码解读

    本文默认读者阅读过JDK8的HashMap源码,不再对源码中的红黑树操作进行分析. 本文主要对put().transfer().addCount()进行分析(replaceNode()源码近似于put ...

  5. java制作烟花源码_java源码解读-java烟花代码!

    解读JAVA代码 正在自学java,刚入门,图形界面没太看懂 贴一段简单的代码,求逐行解释.. java程序解析 public class text6{ final String color; pub ...

  6. 杀疯了,GitHub疯传2022Java面试八股文解析+大厂面试攻略

    前言 本攻略内涵了⾮常详细的知识点:各互联网大厂面经.Java基础.MyBatis.ZooKeeper.分布式.多线程.Elasticsearch..Redis.MySQL.Spring.Spring ...

  7. ConcurrentHashMap源码解读

    曾经研究过jkd1.5新特性,其中ConcurrentHashMap就是其中之一,其特点:效率比Hashtable高,并发性比hashmap好.结合了两者的特点. 集合是编程中最常用的数据结构.而谈到 ...

  8. Java Review - PriorityQueue源码解读

    文章目录 Pre PriorityQueue 概述 PriorityQueue 继承关系 PriorityQueue通过用数组表示的小顶堆实现 时间复杂度 构造函数 方法 add()和offer() ...

  9. Java Review - Queue和Stack 源码解读

    文章目录 Pre 概述 Queue Deque ArrayDeque 一览 构造函数 属性 方法 addFirst() addLast() pollFirst() pollLast() peekFir ...

最新文章

  1. Android中removeCallbacks失效原因
  2. 比特币市场价格一直下跌,未来的市场价值归零的可能性大吗?
  3. java中集合判空_Java中的类型安全的空集合
  4. oracle指令df,​ oracle 常用命令大汇总
  5. PyG图神经网络框架torch-geometric安装
  6. 对keep-alive组件的理解
  7. vba 定义类_工作表中如何响应自定义事件
  8. pycharm python3_为什么pycharm找不到python3
  9. python监控服务器信息进行可视化_Python实现数据可视化,看如何监控你的爬虫
  10. HDU1293+Java+大整数
  11. Regularized Gaussian Covariance Estimation
  12. fileupload控件的属性_FileUpLoad控件简介.ppt
  13. 头文件<ctype.h>
  14. 程序员的生活,其实苦不堪言
  15. mac关闭谷歌自动更新
  16. excel分列---多页批量操作--vba宏实现
  17. 地级市空气污染、空气质量、PM2.5日度数据
  18. mysql强制修改root密码
  19. 针对小游戏的激励视频,如何通过数据分析提升广告收入
  20. ElasticSearch十四--ES-index template 和 aggregation聚合分析

热门文章

  1. 正则表达式2-测试代码
  2. Labview-隧道 移位寄存器
  3. STM32网络ETH
  4. python3安装教程win10_在win10和linux上分别安装Python虚拟环境|python3教程|python入门|python教程...
  5. perl语言学习笔记(3)列表与数组、子程序’、参数
  6. fisher线性判别算法python_干货|机器学习算法之线性判别分析
  7. 数据结构--循环队列
  8. ubuntu下ffmpeg编译安装
  9. SLAM 论文阅读和分类整理
  10. 【笔记】Java数据结构与算法