ConcurrentHashMap弱一致性迭代器

ConcurrentHashMap弱一致性迭代器Iterator 之前查看ArrayList中迭代器实现源码,明白为啥通常用的迭代器在迭代的过程中不能作add和remove操作。但在支持并发数据结构的情况下,还会存在这种情况吗? 答案是不会,少见多怪了,util包中的迭代器实现是fast-failed迭代器,说白了就是一旦由修改就抛异常,在current包中迭代器是弱一致性迭代器,原来两种迭代器情况不一样。 测试代码用以ConcurrentHashMap为例... 阅读详情

什么是弱一致性迭代器???

当创建迭代器后,其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常,能够保持创建迭代器后的元素被正确的Iterator.next()出来。例如ConcurrentHashMap就是弱一致性迭代器,HashMap就是强一致性迭代器。

通过下面代码部分,我们可以更好的理解弱一致性和强一致性迭代器。

package com.iterator;

import java.util.HashMap;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ConcurrentHashMap弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡,HashMap强一致性迭代器
 *
 * @author 小辉GE/小辉哥
 * <p>
 * 2019年8月25日 下午20:00:00
 */
@SuppressWarnings("unused")
public class ConsistentIterationMap {

	public static void main(String[] args) {
//		HashMap<String, String> map = new HashMap<String, String>();
		ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
		map.put("people1", "张三");
		map.put("people2", "李四");
		map.put("people3", "王五");
		map.put("people4", "赵六");

		Iterator<String> it = map.values().iterator();
		new Thread(()->{
			map.remove("people2");
		}).start();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}

采用ConcurrentHashMap测试输出结果如下:

采用HashMap测试输出结果如下:

结果分析:

我们可以看出ConcurrentHashMap可以正常输出结果,HashMap抛出ConcurrentModificationException异常。其实ConcurrentHashMap弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡,HashMap强一致性迭代器。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

 

ConcurrentHashMap 弱一致的迭代器 java.util 包中的集合类都返回 fail-fast 迭代器,这意味着它们假设线程在集合内容中进行迭代时,集合不会更改它的内容。如果 fail-fast 迭代器检测到在迭代过程中进行了更改操作,那么它会抛出 ConcurrentModificationException,这 阅读详情

相关推荐

【java】ConcurrentHashMap遍历 --- 弱一致性的迭代器(Iterator)实现原理

1.概述 转载:ConcurrentHashMap遍历 — 弱一致性的迭代器(Iterator)实现原理 在 Java并发编程实战(进阶篇) 中分析了 Vector 在迭代过程中对容器进行修改会抛出 ConcurrentModificationException 异常,但在并发容器中还会出现这种情况吗? 在并发容器中并不会出现这种情况,这是因为,util包中的迭代器实现是fast-failed迭代器(就是一旦由修改就抛异常),而在current包中迭代器是弱一致性迭代器。 那么我们通过 Concurren.

九师兄 3304

JAVA并发容器:为什么说ConcurrentHashMap是弱一致性的?

ConcurrentHashMap的弱一致性体现在clear、迭代器和get方法,原因在于没有加锁。 举例: 迭代器在遍历数据的时候是一个Segment一个Segment去遍历的,如果在遍历完一个Segment时正好有一个线程在刚遍历完的Segment上插入数据,就会体现出不一致性。 clear也是一样。 get方法在取数据的时候,如果有一个线程正好在put,假设他put的key是存在的,那么ge...

开始写bug~~~ 3959

[后端设计]innovus命令editPin详解?

先放命令,有空慢慢写。

m0_61003348的博客 5726

ConcurrentHashMap为什么是弱一致性的

关于ConcurrentHashMap在之前的ConcurrentHashMap原理分析中已经解释了原理,而HashTable其实大抵上只是对HashMap的线程安全的封装,在JDK7与JDK8中HashMap的实现中解释了HashMap的原理。 至此你应该能够明白,ConcurrentHashMap与HashTable都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能...

奋斗吧_-小青年 6753

10.Labview局部变量、全局变量、引用、属性节点、调用节点用法理解及精讲

本文的结构还是首先教大家明确概念问题,然后深入理解概念并学会使用,最后在理论基础掌握的基础上,通过实例来强化大家的理解。本文依旧是**先理论后实践**的教学方式,欢迎留言或私聊提问。

关注我,更多技术问题欢迎私聊~ 1万+

核心组件大换血:Backbone与Neck魔改篇:YOLO26结合StarNet结构:2026星状网络在YOLO生态的即插即用实战

本文将介绍如何将StarNet作为Backbone替换YOLO26原生架构,以提升边缘设备上的目标检测性能。文章首先分析了YOLO26在特定场景下的精度瓶颈,指出其通用Backbone设计存在不足。随后深入解析StarNet的核心创新——星操作(Star Operation),这一低维计算却能获得高维特征表达的数学魔术,以及其极简的StarBlock模块设计。通过对比YOLO26原生架构的三大创新与痛点,作者提出两种替换策略:完整替换Backbone或局部替换+Neck联调。文中提供了StarNet核心代码

ZDQ58818的博客 288

Java-ConcurrentHashMap迭代器的弱一致性

怀念二抱三抱

文天大人 414

EtherCAT主站SOEM -- 29 -- STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 29 – STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2239

ConcurrentHashMap遍历 --- 弱一致性的迭代器(Iterator)实现原理

在 Java并发编程实战(进阶篇) 中分析了 Vector 在迭代过程中对容器进行修改会抛出 ConcurrentModificationException 异常,但在并发容器中还会出现这种情况吗? 在并发容器中并不会出现这种情况,这是因为,util包中的迭代器实现是fast-failed迭代器(就是一旦由修改就抛异常),而在current包中迭代器是弱一致性迭代器。 那么我们通过 Concurr...

淦淦淦! 2752

GRCNN抓取网络学习2【自制Jacquard数据集训练】

请先完成【机械臂视觉抓取从理论到实战】,这样有利于下面操作的理解!然后第二步是GRCNN抓取网络1【Jacquard数据集等效抓取集制作】,有了自己的数据集输入到GRCNN中是三种文件,接下来就是准备训练GRCNN网络啦!grasps.txtRGB.png本文帮大家根据自制Jacquard数据集训练GRCNN抓取网络,其中包含数据格式的对齐,列举了常见的几种训练方法,相信能坚持到这里的都应该试试顺利了吧!接下来会针对GRCNN调优,期待一下下吧,那就别宁色你的三连。

vor234的博客 2790

在 ABAP 平台配置 OAuth 2.0 Client(OA2C_CONFIG):一份可落地的全景实践

本文详细介绍了在ABAP平台中配置OAuth 2.0客户端的完整流程。重点讲解了四种授权类型(Client Credentials、Authorization Code、SAML 2.0 Bearer Assertion、Resource Owner Password Credentials)的适用场景和配置要点,以及客户端认证的三种方式(Client Secret、Client Certificate、mTLS)。文章提供了操作步骤、排错建议和工程实践指导,包括端点配置、回调地址管理、scopes设置等关

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 354

ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器

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

qq_44688861的博客 935

GEPA_AIME教程:使用GEPA优化数学问题求解的完整指南

本教程展示了如何使用DSPy框架中的GEPA(Generative Evolutionary Prompt Adaptation)优化器来提升大语言模型在数学竞赛问题(AIME)上的表现。# 创建基础的链式思考程序"""带有详细反馈的评估指标,为GEPA提供学习信号"""try:# 处理解析错误feedback_text = f"最终答案必须是一个有效的整数。你回答了'

步子哥的博客 1384

ConcurrentHashMap的迭代器是强一致性还是弱一致性

ConcurrentHashMap当元素个数大于临界值的时候,就会发生扩容。但是ConcurrentHashMap与其他的HashMap不同的是,它不会对Segment 数量增大,只会增加Segment 后面的链表容量的大小。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样了。同步读取操作则是完全非阻塞的。的迭代器是强一致性的,就是说在迭代过程中改变内容会引起报错。

qq_42042621的博客 775

在 Linux 64 位上遭遇 Signal 7 与 ST22 SYSTEM_CORE_DUMPED:从 es/implementation=std 到 /dev/shm 的一套落地排查法

摘要: Linux 64位SAP系统出现SYSTEM_CORE_DUMPED和Signal 7(对应SIGBUS)错误时,核心问题是进程因共享内存资源异常被操作系统强制终止。主要诱因包括:1)/dev/shm的tmpfs默认容量不足(通常仅占物理内存50%);2)SAP内存管理参数es/implementation=map在64位场景下的敏感性。解决方案应双管齐下:在实例profile设置es/implementation=std以降低对tmpfs的依赖,同时按(RAM+Swap)*75%重新配置/dev/

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ConcurrentHashMap是弱一致性分析

本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS §17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析ConcurrentHa

wzq6578702的专栏 7755

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ConcurrentHashMap 能否保证绝对的线程安全?

遍历过程中其他线程可能修改数据,输出结果不反映某一确定时间点的快照。虽然它在设计上提供了高并发能力,但其线程安全是。:经典的“读-改-写”竞态条件(如计数器场景)。是两个独立操作,中间可能被其他线程插入数据。:需要保证多个键操作的原子性(如转账)。)提供无锁或细粒度锁的高并发支持。

大户影视的博客 617

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ConcurrentHashMap 迭代器相关

在常规的HasMap或者ArrayList容器中一个线程再遍历中,其他线程插入或者删除会引起迭代器错误异常。ConcurrentHashMap可以支持并发情况下遍历元素 且可以感知到元素更新。 例子 我们看以下例子 import java.util.Enumeration; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; public class Main { public.

不会写代码的丝丽 1683

高频面试八股文用法篇(十七)ConcurrentHashMap

使用了分段锁(在 Java 8 之前)或细粒度的锁(在 Java 8 及以后版本中通过使用 CAS 操作和 synchronized 块来减少锁的粒度)来确保线程安全,从而避免了 HashMap 在并发环境下的性能问题。(因此,在JDK1.8中,ConcurrentHashMap的实现原理摒弃了这种设计,而是选择了与HashMap类似的数组+链表+红黑树的方式实现,而加锁则采用CAS和synchronized实现。在JDK1.7之前,ConcurrentHashMap是通过分段锁机制来实现的,所以。

我的E家 158

【高并发系统设计必知】:为什么CopyOnWriteArrayList迭代器不支持删除操作?

掌握高并发编程关键细节,解析CopyOnWriteArrayList的迭代器为何不支持删除操作。基于写时复制机制,适用于读多写少场景,保证线程安全的同时避免并发修改异常。原理清晰,值得收藏。

Algorhythm的博客 798

ConcurrentHashMap弱一致性

[原文链接] 本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS §17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析...

weixin_30740581的博客 467

图解ConcurrentHashMap

曾经研究过jkd1.5新特性,其中ConcurrentHashMap就是其中之一,其特点:效率比Hashtable高,并发性比hashmap好。结合了两者的特点。    集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集...

明天的你会感谢今天的自己 2万+

ConcurrentHashMap的安全机制详解

摘要 ConcurrentHashMap是Java并发集合类的经典实现,其安全机制经历了重大演进。JDK 1.7采用分段锁设计,将Map分为16个Segment,写操作只锁相关Segment,读操作完全无锁。JDK 1.8则采用更精细化的CAS+synchronized机制,锁粒度细化到单个桶,结合红黑树优化查询效率。关键改进包括:无锁读依靠volatile保证可见性,CAS操作实现原子更新,多线程协助扩容,以及弱一致性迭代器。两个版本对比显示,JDK 1.8在锁粒度、并发度和内存开销方面均有显著优化。其设

futurn_hero的博客 690

ConcurrentHashMap 和 Hashtable 的区别是什么?

ConcurrentHashMap与Hashtable的线程安全实现对比:Hashtable采用全局锁机制,所有操作同步,性能较差;而ConcurrentHashMap在JDK1.7中使用分段锁,JDK1.8+采用CAS+synchronized细粒度锁,性能更优。读操作上,ConcurrentHashMap完全无锁,Hashtable仍需同步;写操作中,ConcurrentHashMap支持更高并发度。两者都不允许null键值,但迭代器机制不同:Hashtable使用Enumeration,Concurr

weixin_45422672的博客 147
上一篇: 总览十大经典排序算法
下一篇: CopyOnWriteArrayList源码分析、使用场景说明
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值