Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

 Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
 at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
 at java.util.AbstractList$Itr.next(AbstractList.java:343)
 at com.TankClient.paint(TankClient.java:30)
 at com.TankClient.update(TankClient.java:50)
 at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239)
 at sun.awt.RepaintArea.paint(RepaintArea.java:216)
 at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:301)
 at java.awt.Component.dispatchEventImpl(Component.java:4486)
 at java.awt.Container.dispatchEventImpl(Container.java:2116)
 at java.awt.Window.dispatchEventImpl(Window.java:2429)
 at java.awt.Component.dispatchEvent(Component.java:4240)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不明确的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。

注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。

所以出现这种异常的通畅情况是使用了Iterator的原因,比如list。

List<String> mm= new ArrayList<String>();

mm.add("1");mm.add("34");

for(String m : mm){
   System.out.println(m);

  }

如果有时他线程对它mm进行了修改,则抛出上面的异常。

如果要避免这种错误,那么就不要使用Iterator,写成:

for(int i = 0; i< mm.size();++i){

       println(mm.get(i));

}

你可能感兴趣的:(thread,exception,String,list,iterator)