3.ConcurrentHashMap 锁分段机制 Copy-On-Write
/*ConcurrentHashMap*/
Java 5.0 在 java.util.concurrent 包中提供了 多种 并发容器来改进同步容器的性能
ConcurrentHashMap 同步容器类 是 Java5 增加的一个线程安全的 哈希表。对于多线程的操作,介于HashMap 与 HashTable 之间
HashMap 是线程不安全的,不支持并发操作
HashTable 是线程安全的,采用的独占锁,即一次只能有一个线程对容器进行操作
HashTable 还有一个问题,当执行一些复合操作,如:若存在,则删除, if(!table.contans()) { table.put() } ,同样可能出现线程问题
ConcurrentHashMap 介于 HashMap 与 Hashtable 之间。内部采用 “锁分段”机制替代Hashtable的独占锁。进而提高性能(在jdk1.8之后,底层就不采用锁分段的方式了,而是采用CAS算法)
锁分段:
有一个concurrentLevel(分段级别)(默认的级别为16),将锁分成16段,每个段都是一个独立的锁,每段锁会有16(默认)个Entry
当有多个线程并发访问时,可以访问不同的段,实现了并行, 提高了效率,并且提供了一些复合操作的方法
/*其他并发容器类*/
JUC 还提供了其他用于多线程上下文中Collection 实现(以前只能 用synchronize 来同步这些集合的方法,实现同步):
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet
1.当期望许多线程访问一个 给定collection 时,ConcurrentHashMap通常优于同步的HashMap
2.ConcurrentSkipListMap 通常优于同步的TreeMap。
3.当期望的读数 和 遍历 远远大于列表的更新数时,CopyOnWriteArrayList优于同步的ArrayList,
但是 CopyOnWriteArrayList 因为每次更新都会进行复制,开销非常大,并发迭代操作多时可以选择
/*
* CopyOnWriteArrayList /CopyOnWriteArraySet : "写入并复制"
* Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,
*
* 从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。
*
* 当出现并发,多个线程想对这个内容进行操作,读操作的时候,无所谓,读的都是同一份,也不会加锁;;
* 写操作的时候,为了避免修改同一份,采用的策略是,把内容Copy出去形成一个新的内容然后再改,以此来避免并发问题
*
* 从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。
* CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到
*
* 注意 :添加操作多时,效率低因为每次添加时都会将当前List复制一份,开销非常的大。并发迭代操作时可以选择
* */
public class TestCopyOnWriteArrayList {
public static void main(String[] args) {
ListThread lt = new ListThread();
for(int i = 0;i<10;i++) {
new Thread(lt).start();
}
}
} class ListThread implements Runnable {
//private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); 使用 这种同步的ArrayList,当遍历的时候进行 add 操作,就会报错
private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
static {
list.add("1");
list.add("2");
list.add("3");
}
@Override
public void run() {
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
list.add("4");
}
} }
3.ConcurrentHashMap 锁分段机制 Copy-On-Write的更多相关文章
- java多线程 -- ConcurrentHashMap 锁分段 机制
hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. Conc ...
- 四、ConcurrentHashMap 锁分段机制
回顾: HashMap与Hashtable的底层都是哈希表,但是 HashMap:线程不安全 Hashtable:线程安全,但是效率非常低,且存在[复合操作](如"若存在则删除") ...
- 3、JUC--ConcurrentHashMap 锁分段机制
ConcurrentHashMap Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能. ConcurrentHashMap 同步容器 ...
- ConcurrentHashMap(锁分段技术)
线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的HashTab ...
- Java:ConcurrentHashMap的锁分段技术
术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值. 哈希表 hash table 根据设定的哈希函数H(ke ...
- Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...
- 操作系统篇-分段机制与GDT|LDT
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的. ...
- 【JAVA并发编程实战】9、锁分段
package cn.study.concurrency.ch11; /** * 锁分段 * @author xiaof * */ public class StripedMap { //同步策略:就 ...
- Oracle锁的机制
一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...
随机推荐
- Linux -- 信号编程
进程捕捉到信号对其进行处理时,进程正在执行的正常序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令.如果从信号处理程序返回(例如没有调用exit或longjmp),则继续执行在捕捉到信号时 ...
- 《海会圣贤》高清字幕版(由香港佛陀教育协会发布DVD恭敬转成)
常念阿彌陀佛 2015-09-22 视频(建议WIFI下收看)时长72分钟 https://v.qq.com/x/page/f0166amk57h.html 香港佛陀教育协会发布DVD DVD+高 ...
- Yarn简单介绍及内存配置
本文出自:http://blog.chinaunix.net/uid/28311809/abstract/1.html 在这篇博客中,主要介绍了Yarn对MRv1的改进,以及Yarn简单的内存配置和Y ...
- 单层反查BOM
*&---------------------------------------------------------------------* *& Report YCX_001 * ...
- 启后台JOB处理单据遇到锁定问题
/用户XXX已经处理采购凭证 9000036590 DN过账失败:/已冻结临时过账:用户 XXX已冻结编号范围 /用户XXX已经处理采购凭证 9000036589 ???问题:怎么检查采购订单正在 ...
- LeetCode_136. Single Number
136. Single Number Easy Given a non-empty array of integers, every element appears twice except for ...
- 如何理解AWS 网络,如何创建一个多层安全网络架构
目录 一.要求 网络架构图 网络各组件关系 二.操作步骤 2.1.网络设置 2.2.安全设置 2.3.创建实例 三.费用 3.1.NAT 网关费用 一.要求 创建一个三层网络架构,服务器只能通过跳板机 ...
- 【c# 学习笔记】多态
由于可以继承基类的所有成员,子类就都有了相同的行为,但是有时子类的某些行为需要相互区别,子类需要覆写父类中的方法来实现子类特有的行为,这样 的技术在面向对象的编程中就是多态. 多态即相同类型的对象调用 ...
- 【搬运】Visual Studio vs2017 vs2019 中文离线安装包下载,替代ISO镜像
原文地址[侵删]:https://blog.csdn.net/fromfire2/article/details/81104648 以下为搬运内容: 官档地址 https://docs.microso ...
- 最新 小红书java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.小红书等10家互联网公司的校招Offer,因为某些自身原因最终选择了小红书.6.7月主要是做系统复习.项目复盘.LeetCo ...