ConcurrentModificationException异常总结-多线程方式
2015-07-13 00:00
239 查看
1、多线程方式发生异常举例
1.1、java代码如下:
final List<String> myList = createTestData(); new Thread(new Runnable() { @Override public void run() { for (String string : myList) { System.out.println("遍历集合 value = " + string); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { for (Iterator<String> it = myList.iterator(); it.hasNext();) { String value = it.next(); System.out.println("删除元素 value = " + value); if (value.equals("3")) { it.remove(); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start();
1.2、异常信息打印如下:
遍历集合 value = 1 删除元素 value = 1 删除元素 value = 2 遍历集合 value = 2 遍历集合 value = 3 删除元素 value = 3 删除元素 value = 4 Exception in thread "Thread-0" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) at java.util.AbstractList$Itr.next(AbstractList.java:343) at com.primeton.test.Test$1.run(Test.java:119) at java.lang.Thread.run(Thread.java:619) 删除元素 value = 5
当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。说明以上办法在同一个线程执行的时候是没问题的,但是在异步情况下依然可能出现异常。
2、解决办法
2.1、采用以下代码,将不会出现之前的异常
final List<String> myList = new CopyOnWriteArrayList<String>(); myList.add("1"); myList.add("2"); myList.add("3"); myList.add("4"); myList.add("5"); new Thread(new Runnable() { @Override public void run() { for (String string : myList) { System.out.println("遍历集合 value = " + string); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < myList.size(); i++) { String value = myList.get(i); System.out.println("删除元素 value = " + value); if (value.equals("3")) { myList.remove(value); i--; // 注意 } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start();
2.2、输出结果
遍历集合 value = 1 删除元素 value = 1 遍历集合 value = 2 删除元素 value = 2 遍历集合 value = 3 删除元素 value = 3 遍历集合 value = 4 删除元素 value = 4 遍历集合 value = 5 删除元素 value = 5
3、相关总结
1、使用Collections.synchornizedXxx方法,获得线程安全对象2、使用java.util.concurrent/java.util.concurrent.atomic并发编程对象开发
另附java中线程安全的类:HashTable、Vector、Stack、StringBuffer等
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- c#实现多线程局域网聊天系统
- PHP使用CURL实现多线程抓取网页
- 浅解关于C#多线程的介绍
- 批处理程序中的“多线程”处理代码
- c#中多线程访问winform控件的若干问题小结
- C#中的多线程多参数传递详解