今天在写Java代码的时候,由于在多个线程中对ArrayList进行并发操作,结果程序在运行一段时间之后会引起java.util.ConcurrentModificationException异常:
1.程序描述:
我的程序中有两个线程, Main Thread 和Handler Thread:
1). Main Thread中会进行List的删除和遍历操作, 确切的顺序是先删除后遍历;
2). Handler Thread中会进行List的添加操作。
2.问题描述:
从引用文章描述可以总结为:在迭代方式中,当iterator被创建之后,集合再发生改变就会抛出ConcurrentModificationException异常。就是说遍历的时候进行删除操作或遍历的时候进行添加操作会引起ConcurrentModificationException。在知道原因并解决了这个问题之后,那针对我的程序,还有一个值得担忧的地方就是,不考虑遍历,单纯对ArrayList并发的删除和添加操作会不会引起ConcurrentModificationException异常(当然这里的并发还是有一些处理的,并不是说没有任何限制的情况)。
3. 个人分析:
根据ArrayList的特点,解决了遍历操作和其它并发操作所产生的异常之后,我认为在进行添加操作的时候应该不需要再对ArrayList实例进行加锁或进行同步操作 。经过测试之后, 并发的添加和删除操作并没有引起ConcurrentModificationException异常。但考虑到ArrayList并不是线程安全的,所以我也重新检查了下程序逻辑,程序本身的逻辑在一定程度上也避免了并发的删除和添加操作所引起的ArrayList线程安全性问题。
4. 引用文献
http://stackoverflow.com/questions/3184883/concurrentmodificationexception-for-arraylist
http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html