3.JUC线程高级-同步容器 ConcurrentHashMap
Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。
- ConcurrentHashMap 同步容器类是Java5 增加的一个线程安全的哈希表。对于多线程的操作,介于HashMap与Hashtable之间。内部采用
锁分段
机制代替Hashtable 的独占锁
。进而提高性能。 - 此包还提供了设计用于多线程上下文中的Collection 实现:
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。 - 当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。
- 当期望的
读
数和遍历远远大于
列表的更新
数时,CopyOnWriteArrayList 优与同步的 ArrayList。
1. Hashtable 之所以效率低下的原因:
内部使用独占锁
机制,特别是遇到大量的复合操作
时效率就会很低。
2. ConcurrentHashMap 采用 锁分段
机制:
concurrentLevel分段级别,默认16段(segment)
这里每个分段都是一个独立的锁,这就意味着多个线程并发访问时并行执行,效率瞬间就高了。并且该类内部也提供了一些复合操作的方法。
在JDK1.8之后,jvm底层将ConcurrentHashMap底层的分段锁
转换为了 CAS(不会阻塞,不涉及上下文交互) 机制
3. CopyOnWrite 写入并复制
在此之前我们模拟并发修改异常情况:在遍历集合时为集合添加元素
package com.pyy.juc;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;public class TestCopyOnWriteArrayList {public static void main(String[] args) {HelloThread ht = new HelloThread();for(int i = 0; i < 10; i++) {new Thread(ht).start();}}
}class HelloThread implements Runnable {private static List<String> list = Collections.synchronizedList(new ArrayList<String>());static {list.add("AA");list.add("BB");list.add("CC");}@Overridepublic void run() {Iterator<String> it = list.iterator();while(it.hasNext()) {System.out.println(it.next());list.add("AA");}}
}
结果:报并发修改异常java.util.ConcurrentModificationException
java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at com.pyy.juc.HelloThread.run(TestCopyOnWriteArrayList.java:35)at java.lang.Thread.run(Thread.java:745)
如果遇到这样的操作我们可以使用 CopyOnWriteArrayList 并发容器类解决这问题:这个类的底层会在你执行写入之前先复制出一个新的列表再执行写入。
注意:
- 添加操作多时,效率低,因为每次添加都会进行复制,开销非常大。
- 适用于迭代(遍历操作)多,同时又考虑并发安全可以使用
3.JUC线程高级-同步容器 ConcurrentHashMap相关推荐
- 并发编程-13线程安全策略之两种类型的同步容器
文章目录 脑图 概述 同步容器 集合接口下的同步容器实现类 Vector (线程安全性比ArrayList好一些,但并非绝对线程安全) 同步容器 线程不安全的场景 其他注意事项 Hashtable C ...
- 同步容器和并发容器的区别
同步容器:可以简单地理解为通过synchronized来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会串行执行.比如Vector,Hashtable,以及Collections.synch ...
- 往map里的vector添加_面试官问我同步容器(如Vector)的所有操作一定是线程安全的吗?我懵了!...
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列等. 最常见的同步容器就是Vector和Hashtable了,那么,同步容器的所有操作都是线 ...
- 原创 | 面试官问我同步容器(如Vector)的所有操作一定是线程安全的吗?我懵了!...
△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 226篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 为了方便编写出线程安全 ...
- 往map里的vector添加_面试官:同步容器(如Vector)的所有操作一定是线程安全的吗?...
专注于Java领域优质技术,欢迎关注 作者:HollisChuang 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列等. 最常见的同步容器 ...
- JDK1.7和JDK1.8中HashMap是线程不安全的,并发容器ConcurrentHashMap模型
一.HashMap是线程不安全的 前言 只要是对于集合有一定了解的一定都知道HashMap是线程不安全的,我们应该使用ConcurrentHashMap.但是为什么HashMap是线程不安全的呢,之前 ...
- LinuxC高级编程——线程间同步
LinuxC高级编程--线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的. 1. 互斥锁mutex 多个线程同时访问共享数据时可能会冲突.对于多线程的程序,访问冲突的问题是很普遍的,解决的办法 ...
- 读Java并发编程实践记录_原子性_锁_同步容器详解_任务执行
原子性: 单独的,不可分割的操作 不要使用过期状态值来决策当下的状态, 一定要先检查再执行(不检查, 将引发数据修改,丢失) 避免延迟初始化(懒加载: 先查看对象 == null, 然后new), 有 ...
- Java并发(9)- 从同步容器到并发容器
引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全的, ...
- Java多线程概念[同步容器,并发容器](二)
同步容器 同步容器通过synchronized关键字修饰容器,保证同一时刻只有一个线程使用容器,从而使容器线程安全. synchronized的意思的同步. 1.Vector和ArrayList都实现 ...
最新文章
- 在linux和windows下自动备份数据库
- 【数理知识】《积分变换与场论》王振老师-第2章-拉普拉斯变换
- Nacos的服务注册表结构是怎样的?
- awk高级企业级使用案例
- 计蒜客-三值排序(贪心)
- 如何使用 Echarts 给绘制出来的地图描边
- 维护机房服务器工作,机房维护(服务器搬迁方案).doc
- 共话新基建,墨天轮数据库大咖讲坛第一期圆满成功!(附第二批中奖名单)...
- uni-app 地图拖拽后,回到我的位置
- N,N-二甲基十二烷基胺(CAS 112-18-5)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- ins无法发帖_instagram发完图片就没了_ins发不了照片_解决方法
- C语言REPEAT程序,汇编语言定使用WHILE、REPEAT、FOR 和 FORC伪指令定义重复语句块
- ubuntu 自定义开机画面
- 【水果大全】快看,你属于哪种水果身材?
- “实践与理论相结合”是开发人员的学习之道
- springboot和redis处理页面缓存
- Blender齿轮制作
- [经济学原理|政治部分]剩余价值理论
- linux netstat 命令
- MySQL安装问题—— Can‘t create directory ‘C:\web\mysql-8.0.11\data\‘ (OS errno 2 - No such file or directo