ConcurrentModificationException 避免

开题报告该怎么写 考研即将来临,而一般很多大学都会选择在考研结束之后开始安排选题和开题报考(考研之前一般都不谈,老师也很人性化的,不愿意耽误你的复习) 但无论怎么推迟,我们最终都需要去面对并完成这些任务。 现在我就要教大家该如何写一个完整的开题报告! 准备模板。不同的学校有不同的格式,一般情况你的导师会给你们一个学校的标准格式,这个不用太费心。有了模板我们就可以按照模板的“线索”一步一步填充完成即可! 一般大致格式可谓: 研究背景/论文的目的、背景和意义 我们需要写明选择该题目的... 阅读详情

背景:

在网络程序中经常遇到多个线程同时去操作一个集合Set,List.Map,Queue。Hashtable,Vector 在迭代集合的时候如何避免java.util.ConcurrentModificationException的发生。

以Hashtable为例,api中不是说Hashtable是同步的吗?

答:通过源码查看Hashtable中有一个keySet内部类,keySet对象又是通过Collections.synchronizedSet生成的,而Collections.synchronizedSet中并没有对iterator添加同步关键字。

SynchronizedCollection<E>类的iterator源码

 

public Iterator<E> iterator() {
     return c.iterator(); // Must be manually synched by user!
}

Hashtable类同样也不会对iterator进行同步处理,只有数据修改才加同步关联字。

替代过程中删除元素:

方法:迭代过程中删除元素使用迭代器的remove方法,而不是foreach

 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {

	public static void main(String[] args) throws InterruptedException {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		// error
		try {
			for (String str : list) {
				list.remove(str);
				System.out.println(str);
			}
		} catch (Exception e) {
			System.err.println(e);
			Thread.sleep(100);
		}
		System.err.println("------------------------------");
		// success
		for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
			String str = iterator.next();
			System.out.println(str);
			iterator.remove();
		}
		System.out.println("size = " + list.size());
	}
}

 

 

 

 

 

 

多线程并发一个线程添加元素,另一个线程迭代元素:

方法1:多线程并发操作在迭代的时候获取集合对象的锁,使其它线程访问带synchronized的方法时堵塞。

 

package test;

import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;

public class Test {

	private static Map<String, String> map = new Hashtable<String, String>();

	public static void main(String[] args) {
		// Collections.syn(list)
		map.put("a", "a");
		map.put("b", "b");
		map.put("c", "c");
		Thread th1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					try {
						Thread.sleep(300);
						map.put(String.valueOf(i), String.valueOf(i));
						System.out.println("map put " + i);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		th1.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		synchronized (map) {
			for (Entry<String, String> tmp : map.entrySet()) {
				try {
					Thread.sleep(1000);
					System.out.println("iterator key " + tmp.getKey());
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

 

附:HashMap 可通过Collections.synchronizedMap实现同步

 

方法3:使用java.util.concurrent.ConcurrentHashMap

 

 

package test;

import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentSkipListMap;

public class Test {
	private static Map<String, String> map = new ConcurrentSkipListMap <String, String>();


	public static void main(String[] args) {
		// Collections.syn(list)
		map.put("a", "a");
		map.put("b", "b");
		map.put("c", "c");
		Thread th1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					try {
						Thread.sleep(400);
						map.put(String.valueOf(i), String.valueOf(i));
						System.out.println("map put " + i);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		th1.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		for (Entry<String, String> tmp : map.entrySet()) {
			try {
				System.out.println("iterator key " + tmp.getKey());
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

总结:对Hashtable 或HashMap在迭代的时候添加加 synchronized会造成其它线程的堵塞,ConcurrentHashMap时并不会迭代时不会堵塞其它线程。效率更高。

ConcurrentHashMap专门用于高并发大数据线程安全的类,高并发、大数据写入时性能优说Hashtable与Collections.synchronized(),而且他们的锁方式也不一样(synchronized,lock)。

 

 

全球第一开源云ERP Odoo操作手册 模块安装和界面汉化指南 Odoo 的功能包含在不同的模块中, 刚创建的数据库除 Odoo 的核心模块外, 其它模块并没有被安装到系统中,你可以根据需要安装它们。本节将介绍安装模块和界面汉化的相关知识。 阅读详情

相关推荐

【邻接表存图模板】vector邻接表、数组邻接表、链式前向星

一、目录 一、目录 二、前言 三、邻接表“详解” (一)边的信息 (二)几种邻接表的实现方法“详解” 1.数组邻接表 代码 2.vector邻接表 代码 vector邻接表还有一种魔性写法: 3.链式前向星 代码 四、总结 二、前言 本来之前自己太弱了,一直只会用邻接矩阵,后来发现邻接表才是主流... 参考&特别鸣谢: https://www.cnblog...

十里寒塘路♣烟花一半醒 3113

如何避免ConcurrentModificationException

ConcurrentModificationException出现原因: 1.在Java集合类中,当我们在使用iterator遍历集合对象时,当集合被改变且在使用迭代器遍历集合的时候,迭代器的next()方法将抛出ConcurrentModificationException异常。 2.如果subList()生成一个新的List对象,那么当修改原始List对象的结构时,则将抛出ConcurrentModificationException import java.util.ArrayList; import

weixin_43664019的博客 585

别再手动更新Excel了!用Jira看板管理你的个人项目(附保姆级配置流程)

本文详细介绍了如何利用Jira看板替代Excel进行个人项目管理,提供从注册到配置的保姆级教程。通过极简看板模式、自动化规则和数据分析功能,帮助用户实现任务可视化、协作高效化和提醒自动化,大幅提升个人工作效率。特别适合需要管理复杂个人项目的用户。

weixin_42699679的博客 228

如何避免 ConcurrentModificationException 异常

在实际生产过程中,碰到了一个概念中的异常,ConcurrentModificationException。 这个异常主要出现在集合的遍历中,对集合进行了add或者remove的操作; 以ArrayList为例子,当在forEach的时候,对list本身进行add或者remove的操作,查看ArrayList的源码,相当于是移动了指针;点击查看 以HashMap为例,集合的修改有一个modCount...

张小挑的博客 1919

在overleaf中使用bibtex引用参考文献

最近在挑选写tex的平台,挑来挑去,个人感觉overleaf给我带来的体验感是最舒适的。不过由于对内部的文件组织和make进行了一层封装,所以与一般的本地平台编译tex会有一点不同。此处写一下在overleaf中使用bibtex的方法。 在tex中使用bibtex引用文献是一件很舒适的事,毕竟这是tex的优点之一(要是tex比word难用,我干什么不去用word,hhh) 第一步,我们创建一个.bib文件,名字随便起,我这边起为reference.bib。 然后打开谷歌学术,搜索你想要引用的文章,并找到

锦恢的博客 4万+

等时替代模型( Isotemporal Substitution Model)

文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上)

姚巨龙的博客 1万+

4.ConcurrentModifyException的产生原因及如何避免

4.ConcurrentModifyException的产生原因及如何避免目录1 关于ConcurrentModificationException2 单线程触发场景举例  2.1 单线程触发举例  2.2 解决单线程环境的ConcurrentModificationException异常  2.3 ArrayList集合改为CopyOnWriteArrayLis  2.4 通过迭代器遍历删除  ...

大屎蛋教程网 8007

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1528

多线程并发修改异常(ConcurrentModificationE)产生的原因以及解决方案

并发修改异常一 什么是并发修改异常(ConcurrentModificationException)二并发修改异常(ConcurrentModificationException)产生的原因1 modCount是什么意思?2 expectedModCount是什么意思?3 modCount != expectedModCount的原因三解决并发修改异常的方案1使用 Vector(同步的)为什么使用Vector2 使用Collections.synchronizedListCollections.synchr

weixin_45851575的博客 9124

简谈基于FPGA的千兆以太网设计

简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货。 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学习起来非常不容易。其实,我可以告诉大家,前期学习的基础打扎实了,后期的学习也没那么难。总之就是说难没那么难,说容易也不是那么容易。那么,言归正传,下面让我们一起来聊一聊以太网的学习。 说起以太网,大家可能就会想到百兆以太网、千兆以太网以及万兆以太网等等。局域以太网从10M开始发展,经历几多的变迁,发展到现

3619

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

算法大师! 720

ArrayList使用不当带来的ConcurrentModificationException及其五种避免方案

1. 异常出现场景 异常发现于我的如下一段代码中: List<String> arrList = new ArrayList<String>() {{ add("maple"); add("Maple"); add(""); add("boy"); add("Boys"); }}; for (String str:arrList) { if (str.equals("Boys")) { arrLis...

weixin_43300285的博客 1384

基于YOLOv8与UI界面的短视频内容审核系统实现与深度学习应用

YOLO(You Only Look Once)是一种用于实时物体检测的深度学习模型,它能在单次前向传播中同时完成物体检测和定位。YOLOv8是YOLO系列中的最新版本,相较于之前的版本,YOLOv8具有更高的检测精度和更快的推理速度,特别适合需要实时检测的应用场景。YOLOv8通过卷积神经网络(CNN)来提取图像中的特征,并通过多个卷积层来预测每个目标的位置和类别。该模型的优势在于其端到端的结构,使得在视频监控、自动驾驶、安防监控等实时应用中,能够实现快速且高效的目标检测。

YOLO 314

如何避免ConcurrentModificationException 异常

Java Collection classes are fail-fast which means that if the Collection will be changed while some thread is traversing over it using iterator, the iterator.next() will throw a ConcurrentModificati

CS 656

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

使用迭代器时如何避免ConcurrentModificationException

Java Collection类是快速失败的,这意味着如果在使用迭代器遍历某个线程的同时更改了Collection,则iterator.next()将抛出ConcurrentModificationException 。 在多线程以及单线程环境下都可能出现这种情况。 让我们通过以下示例探索这种情况: import java.util.*; public class Iterato...

最佳 Java 编程 417

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

如何避免代码中的ConcurrentModificationException?

  之前说每周坚持更新一篇博客,不管什么类型的都好,但自己还是没能做到,不过从这周开始我会坚持每周至少更新一篇博客!说到做到!   相信大家在编写java代码时,一个稍不留神就会触发到ConcurrentModificationException,直译过来也就是并发修改异常,那么什么样的情况会导致这种异常抛出呢?我在这周上班时就遇到过了,首先先来一段我写的代码,如下所示: public s...

Melo_FengZhi的博客 570

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java.util.ConcurrentModificationException(如何避免ConcurrentModificationException)

java.util.ConcurrentModificationException is a very common exception when working with java collection classes. Java Collection classes are fail-fast, which means if the Collection will be c...

WGH100817的博客 286

如何避免Java中的ConcurrentModificationException

是一种运行时异常,表示在并发环境下,某个线程在遍历集合时,另一个线程修改了集合的结构。然而,​即使是在单线程环境中,也可能触发此异常,例如在遍历过程中直接调用remove()方法。// 抛出ConcurrentModificationException的根源在于集合的结构修改与遍历操作的不一致。理解集合的底层实现(如modCount机制)是解决问题的关键。根据具体场景选择迭代器操作、并发集合或Java 8+的新特性,可以高效避免此类异常。​最佳实践​:在单线程中优先使用迭代器的remove()

zwh1zwh的博客 669

遍历Collection,避免在循环中删除对象时避免ConcurrentModificationException

我们都知道,由于ConcurrentModificationException您无法执行以下操作: for (Object i : l) { if (condition(i)) {

asdfgh0077的博客 451

一文学会如何在开发中避免java.util.ConcurrentModificationException

在使用Java集合类时,java.util.ConcurrentModificationException是一个非常常见的异常。fail-fast机制是Java集合的一种错误机制。如果某个线程在迭代元素时,集合的结构发生了改变,此时iterator.next()就会抛出ConcurrentModificationException异常。 在多线程环境中避免ConcurrentModificationException 在单线程环境中避免ConcurrentModificationException 使用fo

Symon的博客 965

深入剖析Java foreach实现原理,避免ConcurrentModificationException

认识foreach foreach循环是JDK1.5开始引入的,这种方式遍历集合或数组,代码更加简洁。 foreach本质上不过是编译器提供的“语法糖”包装。编译器在遇到for(Type item : arrayOrList) { /* body-of-loop*/ }代码时,会进行代码的转译。 如果是数组,会转成数组的遍历方式: for(int i=0;i<array.length;i++) { Type item = array[i]; /* body-of-loop */ }

编程架构三分天下:分层、分治、分时序。 553

java遍历集合时移除元素,怎样避免ConcurrentModificationException异常抛出

Java 必知必会 第 53 篇 遍历集合时移除元素,怎样避免ConcurrentModificationException异常抛出 问题: 在遍历集合的过程中,不会总出现ConcurrentModificationException异常的抛出,但是在下面的代码块中: public static void main(String[] args) { Collection<Intege...

十年互联网开发老兵,陪你一起学技术 643

ConcurrentModificationException 并发修改异常的出现原因以及避免方法?

并发修改异常 (ConcurrentModificationException)出现原因: 在使用迭代器遍历集合的同时,使用集合对象增加集合的元素;迭代器是依赖集合而存在的,在判断成功后,集合中新增加了元素,而迭代器却不知道就报错了。 /** * 迭代器遍历 + 集合添加 * @param data */ public static void mixture(List<Integer> data) { for(Integer number : data) {

xuewei_ing的博客 699

在迭代一个集合的时候,如何避免ConcurrentModificationException

在遍历一个集合的时候,我们可以使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList

FlySkyLy的博客 693

迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException

迭代器生成器可迭代对象 Java Collection类是快速失败的,这意味着如果在使用迭代器遍历某个线程的同时更改了Collection,则iterator.next()将抛出ConcurrentModificationException 。 在多线程以及单线程环境中都可能出现这种情况。 让我们通过以下示例探索这种情况: import java.util.*; public cl...

最佳 Java 编程 136

java浅表副本,java – 通过制作浅表副本来避免List上的ConcurrentModificationException...

我有一个类如下:class Test{private LinkedList persons = new LinkedList;public synchronized void remove(Person person){persons.remove(person);}public List getAllPersons(){// Clients may iterate over the copy r...

weixin_29310853的博客 182
上一篇: 0RA 29273 24247错误
下一篇: SSO java方式个人实现
javaee_ssh
博客等级 码龄18年 42粉丝 42原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值