zoukankan      html  css  js  c++  java
  • java基础——java.util.ConcurrentModificationException

    在编写代码的时候,有时候会遇到List里有符合条件的的对象,就移除改对象!
    但是这种操作如:使用了 List 的remove,会导致一些很严重的问题!
    如下这段代码使用ArrayList:

    @Test
    	public void testRemoveList(){
    		List<String> list = new ArrayList<String>();
    		list.add("A");
    		list.add("B");
    		list.add("C");
    		list.add("D");
    		list.add("E");
    		for (String string : list) {
    			System.out.println(string);
    			if("C".equals(string)){
    				list.remove(string);
    			}
    		}
    	}
    

    程序运行,报错!!!

    java.util.ConcurrentModificationException
    	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    	at java.util.ArrayList$Itr.next(ArrayList.java:831)
    	at com.test.common.TestCommon.testRemoveList(TestCommon.java:318)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    
    

    这里写图片描述

    千万要记住,不要在循环集合的时候去操作集合的长度!!!!
    千万要记住,不要在循环集合的时候去操作集合的长度!!!!
    千万要记住,不要在循环集合的时候去操作集合的长度!!!!

    这里在小小的说一下,foreach 这个循环,它的原理底层实现其实是
    使用了 Iterator!

    解决方法,
    (1)使用一个临时的集合,如下代码:

    @Test
    	public void testRemoveList(){
    		try {//如果是不重要的业务代码。可以加上try-catch 不要影响主流程的进行
    			
    			List<String> list = new ArrayList<String>();
    			list.add("A");
    			list.add("B");
    			list.add("C");
    			list.add("D");
    			list.add("E");
    			
    			if(list.size() > 0){//循环List一定去判断 非null  和  List-size() > 0
    				List<String> templist = new ArrayList<String>();
    				for (String string : list) {
    					System.out.println(string);
    					if(!"C".equals(string)){
    						templist.add(string);
    					}
    				}
    				System.out.println(templist.toString());
    			}
    			
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    	}
    

    总结,其实这个是一个fail-fast 机制

    fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
    例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

    (2)使用 CopyOnWriteArrayList ,在java.util.concurrent包下,多线程的时候使用,线程安全的!
    将上面代码中的ArrayList换成CopyOnWirteArrayList也不会报错!


    不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

    fail-fast 机制:<a href="http://www.cnblogs.com/skywang12345/p/3308762.html" targer="_blank”>http://www.cnblogs.com/skywang12345/p/3308762.html


    欢迎访问我的csdn博客,我们一同成长!

    "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"
    http://blog.csdn.net/u010648555

  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/aflyun/p/6441377.html
Copyright © 2011-2022 走看看