Java 为什么我没有得到ConcurrentModificationException
我有一个EventBus类来添加/删除处理程序并将事件分派给处理程序: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
在我的主要方法中,我创建了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 =-