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

  • 相关阅读:
    Flask安装教程
    Django进阶(2)
    反编译源码
    Jmeter之Bean shell使用(一)
    接口测试基础(fiddler、postman的使用、python实现测试接口程序)
    Fiddler显示服务器IP的方法
    web测试与app测试的区别
    互联网产品接入支付功能如何测试?
    web测试中的测试点和测试方法总结
    使用JMeter建立接口测试
  • 原文地址:https://www.cnblogs.com/aflyun/p/6441377.html
Copyright © 2011-2022 走看看