[英]Java List Remove Without Iterator
我的程序中有一个事件处理程序系统,其中插件可以注册事件侦听器。
使用此方法调用事件。
/**
* Pass an event to registered {@link EventHandler}s.
*
* @param event Event to pass.
*/
public void callEvent(Event event) {
synchronized (this) {
HandlerList handlers = event.getHandlers();
List<RegisteredListener> listeners = handlers.getRegisteredListeners();
for (RegisteredListener registration : listeners) {
try {
registration.callEvent(event);
} catch (Throwable ex) {
Log.e(TAG, "Could not pass event " + event.getClass().getSimpleName() + " to " + registration.getListener().getClass().getName(), ex);
}
}
}
}
HandlerList
只是List<RegisteredListener>
的容器。
某些事件侦听器在被调用后需要取消注册,这会导致循环中出现ConcurrentModificationException
。 系统性能至关重要,我想避免为每个事件做List.toArray()
或类似的副本; 经常有100个事件。 如何允许从子监听器修改列表?
一些评论:
CopyOnWriteArrayList
中(它将阻止CME),并且不需要显式锁定 List.toArray
非常快(复制100大小的列表应该不到一微秒) registration.callEvent(event)
)调用alien方法,因为它可能导致恼人的错误,例如死锁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.