精华内容
下载资源
问答
  • HashMap并发修改异常解决办法

    千次阅读 2017-04-20 19:18:56
    我在循环读取hashmap里的内容时,在循环中又在另外一个线程对hashmap...翻译过来就是并发修改异常,上网找了下资料,解决方法如下: 调用HashMap的reomve方法时会出现 java.util.ConcurrentModificationExcepti
    我在循环读取hashmap里的内容时,在循环中又在另外一个线程对hashmap进行修改,于是出现了如下这个异常

    java.util.ConcurrentModificationException

    翻译过来就是并发修改异常,上网找了下资料,解决方法如下:

    调用HashMap的reomve方法时会出现 java.util.ConcurrentModificationException 。解决方法就是先用Iterator的方法remove,然后再调用HashMap的remove方法。即代码如下:

    微笑

    Iterator<Integer> keys = gradeMap.keySet().iterator();
    while(keys.hasNext()) {
    Integer i = keys.next();
    i f(!gradesIds.contains(i)) {
    keys.remove();
    gradeMap.remove(i);

    }

    }

    我加入这段代码之后,还是会出现该异常,于是继续寻找原因,发现了这样两段话:

    1.如果你的程序是高并发,并且你的map是经常修改的,千万不要用HashMap,会把这个线常卡死的,要用ConcurrentHashMap


    2.虽然HashTable和ConcurrentHashMap都是线程安全的,但是HashTable是同步容器,ConcurrentHashMap是并发容器,采用了锁分离策略,在并发环境中,应多使用ConcurrentHashMap,因为它具有非常好的并发性能,可以多个线程同时读写。而HashTable只能同时一个线程读写。
    可以简单的把ConcurrentHashMap理解为多个HashMap组合,锁不是在ConcurrentHashMap上,而是在某个HashMap上。
    注意:ConcurrentHashMap和HashMap的一个不同点就是ConcurrentHashMap里不能存放key和value为空的值。

    于是我将Hashmap改为ConcurrentHashMap,经调试,解决了该问题。
    展开全文
  • 使用并发集合替换掉原集合可以实现并发修改安全。 原集合 并发集合 注意 HashMap ConcurrentHashMap<K,V> Hashtable虽然线程安全但不支持并发修改 LinkedHashMap ConcurrentSkipListMap<K,V>...

    java.util.ConcurrentModificationException异常

    使用并发集合替换掉原集合可以实现并发修改安全。

    原集合 并发集合 注意
    HashMap ConcurrentHashMap<K,V> Hashtable虽然线程安全但不支持并发修改
    LinkedHashMap ConcurrentSkipListMap<K,V> 支持排序,且并发安全
    LinkedHashSet ConcurrentSkipListSet 支持排序,且不允许有重复元素
    Queue ConcurrentLinkedQueue 只能操作队列头
    Deque ConcurrentLinkedDeque 队头队尾都可操作
    ArrayList CopyOnWriteArrayList 支持并发安全
    HashSet CopyOnWriteArraySet 支持并发安全

    展开全文
  • 今天小编就为大家分享一篇关于collection集合体系与并发修改异常解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 并发修改异常: 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 // ConcurrentModificationException 产生的原因: 迭代器是依赖于集合而存在的,在判断成功之后,集合当中增加了新的元素,而...

    并发修改异常: 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

    //  ConcurrentModificationException
    

    产生的原因:
    迭代器是依赖于集合而存在的,在判断成功之后,集合当中增加了新的元素,而迭代器却不知道,所以就报错了,这个就叫并发修改异常。

    package cn.hhy.test_04;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class ListIteratorDemo2 {
    	public static void main(String[] args) {
    		//创建集合对象
    		List list = new ArrayList();
    						
    		//添加对象
    		list.add("hello");
    		list.add("world");
    		list.add("java");
    		
    		//迭代器遍历
    		Iterator it = list.iterator();
    		while(it.hasNext()){
    			String string = (String) it.next();
    			//ConcurrentModificationException
    			if(string.equals("world")){
    				list.add("javaee");
    			}
    		}
    		
    		System.out.println("list:"+list);
    	}
    }
    
    

    所报的错误:

    Exception in thread "main" java.util.ConcurrentModificationException
    	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    	at java.util.AbstractList$Itr.next(AbstractList.java:343)
    	at cn.hhy.test_04.ListIteratorDemo2.main(ListIteratorDemo2.java:23)
    
    

    也就是迭代器遍历元素的时候,集合不能进行修改元素。
    解决方案:

    • 1.迭代器迭代元素,迭代器修改元素:元素跟在刚才迭代元素之后
    		ListIterator lit = list.listIterator();
    		while(lit.hasNext()){
    			String string = (String) lit.next();
    			//ConcurrentModificationException
    			if(string.equals("world")){
    				lit.add("javaee");
    			}
    		}
    
    • 2.集合遍历元素,集合修改元素(普通的for):元素跟在集合最后一个元素之后。
    		for(int i=0;i<list.size();i++){
    			String s = (String)list.get(i);
    			if(s.equals("world")){
    				list.add("javaee");
    			}
    		}
    

    如果你觉得文章不错 ,也麻烦扫码领红包支持一下。或者打开支付宝首页搜“529823781”领红包,领到红包,早点使用哟。也算是对我的一点点支持了。
    在这里插入图片描述

    展开全文
  • Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    参考文章:

    (1)Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    (2)https://www.cnblogs.com/bsjl/p/7676209.html


    备忘一下。


    展开全文
  • ConcurrentModificationException 集合并发修改异常 解决 import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 问题? * 有一个集合,如下,请问,我...
  • 并发修改异常:当遍历集合的同时,又向集合添加(或删除)元素,就可能报并发修改异常(List体系) 解决方法一:列表迭代器,用列表迭代器的添加add(或删除remove)方法 解决方法二:采用...
  • 并发修改异常原理与解决方法

    千次阅读 2017-06-20 17:22:04
    什么是并发修改异常: 当我们在遍历实现了collection接口与iterator接口的集合时(List、Set、Map), 我们可以通过遍历索引也可以通过迭代器进行遍历。在我们使用迭代器进行遍历集合的时候,会获取到当前集合的迭代...
  • 文章目录并发修改异常产生的原因及解决方案A:案例演示需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。ConcurrentModificationException出现解决...
  • 并发修改异常

    2019-10-15 11:06:39
    并发修改(ConcurrentModificationException)异常问题分析? public class ContainerNotSafeDemo { public static void main(String[] args) { listNotSafe(); } private static void listNotSafe() { List...
  • Java并发修改异常

    千次阅读 2017-11-28 17:10:44
    今天突然有人问我并发修改异常怎么回事,当时只记得解决方案,不是很详细的知道底层原因,花了一点点时间,看了下源码,发现其实很简单。以下是我的见解 在Java开发中Exception in thread "main" java....
  • 迭代元素可增减, 使用listIterator()方法 Iterator it=list.listIterator(); Iterator it=list.iterator(); while(it.hasNext()){ Objecte=it.next(); if(“b”.equals(e)){ it.remove(); } }
  • 最近在项目中遇到一个异常,ConcurrentModificationException,造成问题的原因是因为我通过ArrayList的对象进行remove操作,具体问题代码如下: /** * 跟进人列表去重 * * @Param followUpUserInfoVOList * @...
  • 并发修改异常 A:出现的现象 迭代器遍历集合,集合修改集合元素 B:原因 迭代器是依赖于集合的,而集合的改变迭代器并不知道。 C:解决方案 a:迭代器遍历,迭代器修改(ListIterator) 元素添加在刚才迭代...
  • 05Java集合-6. 并发修改异常的产生原因和解决办法*
  • 【产生的原因】 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。 简单描述就是:迭代器遍历元素的时候,是不能通过集合的方法修改元素...
  • Java并发修改异常的源码解析

    千次阅读 2018-07-03 15:31:01
    并发的意思是同时发生,那么其实并发修改的字面意思就是同时修改,通过查看JDK的API我们可以得知,并发修改异常的出现的原因是:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 一个常见的场景就是...
  • 本篇先来一个练习题,引出什么是并发修改异常,然后给出解决这个问题的方案。什么是并发修改异常呢?如果我们在遍历集合元素,并进行添加操作的时候,就会报并发修改异常错误,下面我们来举例一下。 1. 练习题 ...
  • 并发修改异常简介

    2020-09-01 16:56:34
    并发修改异常简介 问题描述 当我们使用普通迭代器的同时,又往集合中添加元素,此时就会报:并发修改异常(ConcurrentModificationException) 细节:这个仅仅是产生并发修改异常的情况之一,还有其他情况。不再一一...
  • 3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationException(并发修改异常) 这也是很多人头疼的问题 并发修改异常产生的原因 在...
  • 集合类并发修改异常解决方案...add方法中使用synchronized关键字解决并发修改异常,但并发度下降 public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); el...
  • 并发修改异常ConcurrentModificationException 产生原因 迭代器遍历过程中,通过集合对象add()方法修改了集合中的元素,使成员变量modCount++(此为实际修改次数)。造成了迭代器获取元素中,判断预期修改次数与实际...
  • 2.异常现象 3.导致原因 4.解决方式 二.集合类不安全之HashSet 1.示例代码 2.异常现象 3.解决方式 ①:Collections.synchronizedSet(); ②:new CopyOnWriteArraySet(); 三.集合类不安全之Map 1.代码演示 ...
  • Iterator在迭代过程中集合发生了改变就会产生次异常,常见在集合的并发修改过程中     for(DeviceParamsBean dpb:devlist){ //此处隐形的进行了迭代 mBridgeService.deleteCamera(dpb.did,false); //此处集合...
  • 并发修改异常是指当方法检测到对象的并发修改...此时就会抛出并发修改异常,这是因为在用迭代器进行遍历集合时同时在增加元素,此时有两种方法解决这个问题: 一:使用ListIterator进行迭代 二:用get方法进行遍历:
  • 迭代器并发修改异常

    2018-03-30 09:01:48
    1 迭代器并发修改异常 java.util.ConcurrentModificationException 就是在遍历的过程中,使用了集合方法修改了集合的长度,不允许的; import java.util.ArrayList; import java.util.Iterator; import java....
  • 产生原因:迭代器是依赖于集合而存在的,在判断成功后,集合中添加了新元素,而迭代器却不知道,所以就报错了,这个错误就叫做并发修改异常 简单来说:迭代器遍历元素的时候,通过集合是不能修改元素的
  • import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator;... * 有一个集合,如果我... * 在if判断中检测到对象的并发修改,但不允许这种修改时,抛出此异常 *
  • modCount的含义、迭代器所包含的方法、为什么会发生并发修改异常都将会在这篇文章中进行说明。 引入 这是一个并发修改异常的示例,它使用了迭代器iterator来获取元素,同时使用ArrayList自身的remove方法移除元素...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,343
精华内容 52,137
关键字:

并发修改异常解决办法