Java 为什么我没有得到ConcurrentModificationException

Java 为什么我没有得到ConcurrentModificationException,java,for-loop,collections,concurrentmodification,Java,For Loop,Collections,Concurrentmodification,我有一个EventBus类来添加/删除处理程序并将事件分派给处理程序: 在我的主要方法中,我创建了2个处理程序,我将它们添加到总线以侦听AEvent并触发AEvent事件: 结果是: -= START =- Add be.test.AEventHandlerImpl1 for event 1 Add be.test.AEventHandlerImpl1 for event 1 I have 2 handlers for event 1 Fire event 1 to be.test.AEve

我有一个EventBus类来添加/删除处理程序并将事件分派给处理程序:

在我的主要方法中,我创建了2个处理程序,我将它们添加到总线以侦听AEvent并触发AEvent事件:

结果是:

-= START =-
Add be.test.AEventHandlerImpl1 for event 1
Add be.test.AEventHandlerImpl1 for event 1
I have 2 handlers for event 1
Fire event 1 to be.test.AEventHandlerImpl1
Remove be.test.AEventHandlerImpl1 for event 1
-= END =-
从不为第二个处理程序调用分派方法。 这是因为在loop语句期间,第一个处理程序将自己从总线(handlersublist)中移除。 我已经在handlersSublist的副本上解决了这个问题,而不是在handlersSublist本身上。 但问题是,为什么我不能得到一个
ConcurrentModificationException
? 在循环过程中,我正在修改
ArrayList
。 在这个例子中,当用户1947415删除列表的第一个元素时,他得到了一个
ConcurrentModificationException
。 在这个例子中,user1699872没有得到异常,因为他使用了一个
迭代器来循环列表。
发生什么事?为什么我没有得到一个
ConcurrentModificationException
,因为我没有使用
Iterator
并且我删除了列表的第一个元素?

有人能解释一下原因吗?

提前谢谢,

我看不到任何关于自行车的信息。。。应该抛出concurrentModificationException的循环在哪里?@Jkike在
EventBus
类的
fireEvent
方法中。您的意思是调度删除
fireEvent
中的事件吗?但您没有删除该循环中的任何内容。如果我读对了,你只是在调度事件。移除部分不在循环中,稍后您将直接访问阵列中的对象位置以移除它。所以没有并发的access@Jkike如果在调用event.dispatch()之后,在类的
aeventhandlempl1
onAEventReceived()
方法中删除对
removeholder()的调用,并在
fireEvent()
方法中添加handlersublist.remove(handler),我会得到相同的结果,也不例外。我没有看到任何关于自行车的。。。应该抛出concurrentModificationException的循环在哪里?@Jkike在
EventBus
类的
fireEvent
方法中。您的意思是调度删除
fireEvent
中的事件吗?但您没有删除该循环中的任何内容。如果我读对了,你只是在调度事件。移除部分不在循环中,稍后您将直接访问阵列中的对象位置以移除它。所以没有并发的access@Jkike如果在调用event.dispatch()之后,在类的
aeventhandlempl1
onAEventReceived()
方法中删除对
removeholder()的调用,并在
fireEvent()
方法中添加handlersublist.remove(handler),则会得到相同的结果,没有例外。
public class AEventHandlerImpl1 implements AEventHandler
{
  @Override
  public void onAEventReceived(AEvent aEvent)
  {
    //do some stuff...
    //... and remove myself from the bus for AEvent
    EventBus.getInstance().removeHandler(AEvent.TYPE, this);
  }
}
  public static void main(String[] args)
  {
    System.out.println("-= START =-");
    //create new handlers
    AEventHandlerImpl1 handler1 = new AEventHandlerImpl1();
    AEventHandlerImpl1 handler2 = new AEventHandlerImpl1();
    //add handlers on the eventBus
    EventBus.getInstance().addHandler(AEvent.TYPE, handler1);
    EventBus.getInstance().addHandler(AEvent.TYPE, handler2);
    //fire event
    EventBus.getInstance().fireEvent(new AEvent());
    //end
    System.out.println("-= END =-");
  }
-= START =-
Add be.test.AEventHandlerImpl1 for event 1
Add be.test.AEventHandlerImpl1 for event 1
I have 2 handlers for event 1
Fire event 1 to be.test.AEventHandlerImpl1
Remove be.test.AEventHandlerImpl1 for event 1
-= END =-