Java高并发编程实战7,ConcurrentHashMap详解
一、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的操作步骤:
- 遇到写操作时,先将当前容器复制一份,然后向新容器里添加元素;
- 原容器可以处理读请求;
- 增加完元素后,再讲引用指向新的容器,原容器等待被GC回收;
CopyOnWrite利用冗余实现了读写分离,这样一来,既没有加锁,又以读写分离的形式处理了并发的读和写请求。
即原容器负责读操作,新容器负责写操作,写完之后,再将引用指向新容器,回收原容器;
- 写少读多的业务,更适合使用CopyOnWrite容器;
- 写多读少的情况,就不适合,因为容器的复制比较消耗性能;
三、BlockingQueue
BlockingQueue是线程安全的Queue,看一下BlockingQueue有哪些方法:
1、常用方法如下
- add():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则返回true,否则抛出异常,通常与poll()配合使用;
- offer():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则返回true,否则返回false,通常与poll()配合使用;
- put():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则直接入队,否则当前线程会一直等待,直到BlockingQueue中有剩余空间,通常与take()配合使用;
- poll():取出BlockingQueue队首元素,如果队列为空,则会持续等待一定的时间,如果等待之后队列仍然为空,则返回NULL;
- take():取出BlockingQueue队首元素,如果队列为空,则当前线程一直等待;
- contains():判断队列中是否包含某元素
- drainTo(Collection c):将队列中的元素全部转移到集合c中;
- drainTo(Collection c, int maxElements):将队列中的前maxElements个元素,转移到集合c中;
- remove():移除队列中的某元素
2、BlockingQueue的实现类
- ArrayBlockingQueue:由数组构成的有界阻塞队列,队列的大小由构造方法的参数指定,主要应用于生产速度和消费速度基本匹配的场景;
- LinkedBlockingQueue:由链表结构组成的有界阻塞队列,队列的大小由构造方法的参数指定,线程池大部分都是直接使用LinkedBlockingQueue;
- PriorityBlockingQueue:支持优先级排序的无界阻塞队列,排序规则可以通过构造方法中的Comparator对象指定,主要应用于电商抢购、会员的优先级、银行办理业务、VIP优先插队等场景;
- 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详解相关推荐
- Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...
JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...
- Java高并发编程详解系列-Java线程入门
根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面. 首先介绍一下这个系列的东西是什么,这个系列自己 ...
- Java高并发编程 (马士兵老师视频)笔记(一)同步器
本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...
- Java高并发编程学习(三)java.util.concurrent包
简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...
- 29W 字总结阿里 Java 高并发编程:案例 + 源码 + 面试 + 系统架构设计
下半年的跳槽季已经开始,好多同学已经拿到了不错的 Offer,同时还有一些同学对于 Java 高并发编程还缺少一些深入的理解,不过不用慌,今天老师分享的这份 27W 字的阿里巴巴 Java 高并发编程 ...
- Java 7并发编程实战手册
2019独角兽企业重金招聘Python工程师标准>>> Java 7并发编程实战手册 本书是 Java 7 并发编程的实战指南,介绍了Java 7 并发API 中大部分重要而有用的机 ...
- java 并发集合_《Java 7并发编程实战手册》第六章并发集合
由人民邮电出版社出版的<Java 7并发编程实战手册>终于出版了,译者是俞黎敏和申绍勇,该书将于近期上架.之前并发编程网组织翻译过此书,由于邮电出版社在并发网联系他们之前就找到了译者,所以 ...
- Java高并发编程详解系列-7种单例模式
引言 在之前的文章中从技术以及源代码的层面上分析了关于Java高并发的解决方式.这篇博客主要介绍关于单例设计模式.关于单例设计模式大家应该不会陌生,作为GoF23中设计模式中最为基础的设计模式,实现起 ...
- Java 高并发第二阶段实战---高并发设计模式,内存模型,CPU一致性协议,volatile关键字剖析
第二阶段的课程主要围绕着Volatile关键字,内存重排序,Happen-Before,Cpu一致性协议,高并发下的设计模式以及类加载器几个大的方面展开,下面是内容详细信息,本教程是本人录制,下载地址 ...
- @冰河老师的巨作,人手一册的Java高并发编程指南,值得了解一下
还真不好意思,这次 Java Thread Pool 惊爆了! 高并发是每一个后端开发工程师都头疼的问题,也是工程师能力的分水岭.要想基于JDK核心技术,玩转高并发编程,必须要好好修炼内功才行. 文章 ...
最新文章
- InfluxDB 开源分布式时序、事件和指标数据库
- 关于释放内存的那点事
- python2.7安装git_[Centos]安装Git2.7.0
- java中比较字符串的大小用String的compareTo()
- mysql bin.000013_mysql的binlog安全删除的一种方法
- Qt5.9生成dll详细步骤
- Xamarin开发IOS笔记:切换输入法时输入框被遮住
- python中解决死锁的方法
- 8月23号刚刚发布的 Flink 1.9 到底优化了哪些功能?
- 大学英语期末考计算机上答卷,英语期末考试质量分析
- Linux内存管理:分页机制
- WPF and Silverlight 学习笔记(十九):WPF更换主题
- @Aspect @around 多个参数
- 数字通信之抽样(二)
- 让设计师哭笑不得的文案
- PS-图像处理:PS抠出图片中的图形轮廓渐变填充
- 数据库事务(Transaction)与锁(Locking)详解图析
- java 配置全局过滤器,如何为Spring Cloud Gateway加上全局过滤器
- 如何使用中国气象局API开发天气APP
- oracle核销预付账款,AP模块外币预付款核销的CNY尾差问题