一、ConcurrentHashMap详解

1、HashMap

在JDK1.8以前,HashMap是基于数组 + 链表来实现的,HashMap是一个数组,每个数组元素又是一张链表。

当向HashMap中增加元素时,会先根据此元素Key的hash值计算出该元素将要保存在数组中的下标。如果多个元素计算出的下标值相同,就会以链表的形式存储在数组的同一个元素中。

2、JDK1.7中的ConcurrentHashMap

JDK1.7中的ConcurrentHashMap间接地实现了Map,并将每一个元素称为分段锁segment,每个segment都是一个HashEntry<K,V>数组,称为table,table的每个元素都是一个HashEntry的单向队列。

默认情况下,ConcurrentHashMap会生成16个segment。

ConcurrentHashMap结构的目的是更加细粒度的给元素加锁,**HashTable是给整个容器加锁,ConcurrentHashMap是给每个segment加锁,**当一个线程修改segment 0时,其他线程也可以修改其它segment,即 只要不同的线程同一时刻访问的是不同的segment,就不会发生写冲突,比HashMap性能更好。

3、JDK1.8中的ConcurrentHashMap

JDK1.8中的Map数据结构改为数组+链表/红黑树的形式,加锁粒度更加小,性能更好。

当链表中的元素超过8个时,HashMap就会将链表转换为红黑树。

ConcurrentHashMap也改为了数组+链表/红黑树的形式,废弃了segment,直接采用volatile HashEntry<K,V>对象保存,即对每一条数据直接通过volatile避免冲突,此外,JDK1.8中还对ConcurrentHashMap使用了更多的synchronized和CAS算法来保证线程安全。

二、CopyOnWrite

CopyOnWrite的操作步骤:

  1. 遇到写操作时,先将当前容器复制一份,然后向新容器里添加元素;
  2. 原容器可以处理读请求;
  3. 增加完元素后,再讲引用指向新的容器,原容器等待被GC回收;

CopyOnWrite利用冗余实现了读写分离,这样一来,既没有加锁,又以读写分离的形式处理了并发的读和写请求。
原容器负责读操作,新容器负责写操作,写完之后,再将引用指向新容器,回收原容器;

  • 写少读多的业务,更适合使用CopyOnWrite容器;
  • 写多读少的情况,就不适合,因为容器的复制比较消耗性能;

三、BlockingQueue

BlockingQueue是线程安全的Queue,看一下BlockingQueue有哪些方法:

1、常用方法如下

  1. add():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则返回true,否则抛出异常,通常与poll()配合使用;
  2. offer():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则返回true,否则返回false,通常与poll()配合使用;
  3. put():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则直接入队,否则当前线程会一直等待,直到BlockingQueue中有剩余空间,通常与take()配合使用;
  4. poll():取出BlockingQueue队首元素,如果队列为空,则会持续等待一定的时间,如果等待之后队列仍然为空,则返回NULL;
  5. take():取出BlockingQueue队首元素,如果队列为空,则当前线程一直等待;
  6. contains():判断队列中是否包含某元素
  7. drainTo(Collection c):将队列中的元素全部转移到集合c中;
  8. drainTo(Collection c, int maxElements):将队列中的前maxElements个元素,转移到集合c中;
  9. remove():移除队列中的某元素

2、BlockingQueue的实现类

  1. ArrayBlockingQueue:由数组构成的有界阻塞队列,队列的大小由构造方法的参数指定,主要应用于生产速度和消费速度基本匹配的场景;
  2. LinkedBlockingQueue:由链表结构组成的有界阻塞队列,队列的大小由构造方法的参数指定,线程池大部分都是直接使用LinkedBlockingQueue;
  3. PriorityBlockingQueue:支持优先级排序的无界阻塞队列,排序规则可以通过构造方法中的Comparator对象指定,主要应用于电商抢购、会员的优先级、银行办理业务、VIP优先插队等场景;
  4. DelayQueue:支持延迟存取的无界队列,队列中的某个元素必须在一段时间后才能被取出;

Java高并发编程实战系列文章

Java高并发编程实战1,那些年学过的锁

Java高并发编程实战2,原子性、可见性、有序性,傻傻分不清

Java高并发编程实战3,Java内存模型与Java对象结构

Java高并发编程实战4,synchronized与Lock底层原理

Java高并发编程实战5,异步注解@Async自定义线程池

Java高并发编程实战6,通过AQS源码分析lock()锁机制

哪吒精品系列文章

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

SQL性能优化的21个小技巧

Java基础教程系列

Spring Boot 进阶实战

Java高并发编程实战7,ConcurrentHashMap详解相关推荐

  1. Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...

  2. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  3. Java高并发编程 (马士兵老师视频)笔记(一)同步器

    本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...

  4. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  5. 29W 字总结阿里 Java 高并发编程:案例 + 源码 + 面试 + 系统架构设计

    下半年的跳槽季已经开始,好多同学已经拿到了不错的 Offer,同时还有一些同学对于 Java 高并发编程还缺少一些深入的理解,不过不用慌,今天老师分享的这份 27W 字的阿里巴巴 Java 高并发编程 ...

  6. Java 7并发编程实战手册

    2019独角兽企业重金招聘Python工程师标准>>> Java 7并发编程实战手册 本书是 Java 7 并发编程的实战指南,介绍了Java 7 并发API 中大部分重要而有用的机 ...

  7. java 并发集合_《Java 7并发编程实战手册》第六章并发集合

    由人民邮电出版社出版的<Java 7并发编程实战手册>终于出版了,译者是俞黎敏和申绍勇,该书将于近期上架.之前并发编程网组织翻译过此书,由于邮电出版社在并发网联系他们之前就找到了译者,所以 ...

  8. Java高并发编程详解系列-7种单例模式

    引言 在之前的文章中从技术以及源代码的层面上分析了关于Java高并发的解决方式.这篇博客主要介绍关于单例设计模式.关于单例设计模式大家应该不会陌生,作为GoF23中设计模式中最为基础的设计模式,实现起 ...

  9. Java 高并发第二阶段实战---高并发设计模式,内存模型,CPU一致性协议,volatile关键字剖析

    第二阶段的课程主要围绕着Volatile关键字,内存重排序,Happen-Before,Cpu一致性协议,高并发下的设计模式以及类加载器几个大的方面展开,下面是内容详细信息,本教程是本人录制,下载地址 ...

  10. @冰河老师的巨作,人手一册的Java高并发编程指南,值得了解一下

    还真不好意思,这次 Java Thread Pool 惊爆了! 高并发是每一个后端开发工程师都头疼的问题,也是工程师能力的分水岭.要想基于JDK核心技术,玩转高并发编程,必须要好好修炼内功才行. 文章 ...

最新文章

  1. InfluxDB 开源分布式时序、事件和指标数据库
  2. 关于释放内存的那点事
  3. python2.7安装git_[Centos]安装Git2.7.0
  4. java中比较字符串的大小用String的compareTo()
  5. mysql bin.000013_mysql的binlog安全删除的一种方法
  6. Qt5.9生成dll详细步骤
  7. Xamarin开发IOS笔记:切换输入法时输入框被遮住
  8. python中解决死锁的方法
  9. 8月23号刚刚发布的 Flink 1.9 到底优化了哪些功能?
  10. 大学英语期末考计算机上答卷,英语期末考试质量分析
  11. Linux内存管理:分页机制
  12. WPF and Silverlight 学习笔记(十九):WPF更换主题
  13. @Aspect @around 多个参数
  14. 数字通信之抽样(二)
  15. 让设计师哭笑不得的文案
  16. PS-图像处理:PS抠出图片中的图形轮廓渐变填充
  17. 数据库事务(Transaction)与锁(Locking)详解图析
  18. java 配置全局过滤器,如何为Spring Cloud Gateway加上全局过滤器
  19. 如何使用中国气象局API开发天气APP
  20. oracle核销预付账款,AP模块外币预付款核销的CNY尾差问题

热门文章

  1. 2017华为面试算法题小结
  2. Camera:双目成像原理
  3. JAVA常用框架及漏洞
  4. 孪生网络keras实现minist
  5. 电子签的背后江湖:腾讯、蚂蚁、字节跳动的较量
  6. 数据库安全关键技术之数据库脱敏技术详解
  7. 数电基础-数字电路芯片种类
  8. java 区位码转中文_国标码、区位码、机内码之间的转换关系
  9. obs源码分析【二】:录制功能剖析
  10. ESP8285与ESP8266的差异