java基础——java.util.ConcurrentModificationException
来源:互联网 发布:mac skype 下载 编辑:程序博客网 时间:2024/05/01 19:28
在编写代码的时候,有时候会遇到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 机制:http://www.cnblogs.com/skywang12345/p/3308762.html
0 0
- java基础——java.util.ConcurrentModificationException
- 异常记录——java.util.ConcurrentModificationException
- 【ConcurrentModificationException】java.util.ConcurrentModificationException 解决办法
- java.util.ConcurrentModificationException! java.util.ConcurrentModificationException!
- java:java.util.ConcurrentModificationException
- 异常:java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException异常
- java.util.ConcurrentModificationException异常
- java.util.ConcurrentModificationException 解决办法
- java.util.ConcurrentModificationException 异常
- 异常:java.util.ConcurrentModificationException
- 异常:java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- java.util.ConcurrentModificationException
- jQuery中$()可以有两个参数
- ls基本功能的实现
- 新上市Lighthouse专用芯片TS3633规格介绍
- SQL中的cast()函数详解
- Box2D 源码编译
- java基础——java.util.ConcurrentModificationException
- 好姑娘向暖而生
- poj1523 最小割+并查集
- 日常生活中有哪些十分钟就能学会并可以终生受用的技能
- AngularJS事件绑定的使用详解
- Spring Boot 实用MyBatis做数据库操作
- Longest Consecutive Sequence ---LeetCode
- hotplug_uevent机制学习笔记
- SQLServer中日期函数大全