有一个类:
@Component
public class EventPublisherImpl implements EventPublisher {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private List<EventListener> listeners = new ArrayList<>();
@Override
public void addListener(EventListener toAdd) {
listeners.add(toAdd);
}
@Override
public void removeListener(EventListener toRemove) {
listeners.remove(toRemove);
}
public void publicEvent(AmiObject amiObject) {
if (listeners != null && !listeners.isEmpty()) {
Iterator<EventListener> iterator = listeners.iterator();
while (iterator.hasNext())
synchronized (iterator) {
EventListener eventListener = iterator.next();
if (eventListener != null) {
eventListener.publicEvent(amiObject);
}
}
}
}
}
EventListeners 从不同的线程添加到它。
因此,在启动时,会出现错误:
Exception in thread "Thread-1" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
at ...EventPublisherImpl.publicEvent(EventPublisherImpl.java:34)
at ...AmiObjectParserImpl.parseStr(AmiObjectParserImpl.java:45)
at ...ConnectorImpl.listenSocket(ConnectorImpl.java:214)
at ...ConnectorImpl.run(ConnectorImpl.java:92)
at java.base/java.lang.Thread.run(Thread.java:834)
并指向线
EventListener eventListener = iterator.next();
捕获这样的监视器
没有意义,因为
listeners.iterator();向每个传入线程返回一个新对象 - 一个迭代器,来自类的证明ArrayList例如在集合本身上同步
迭代器
ArrayList不支持列表的并发修改,除了通过迭代器本身的方法。当检测到并行更改时,ConcurrentModificationException会在文档中对此进行说明:此外,它本身不是
ArrayList线程安全的,这可能会导致其他错误和数据不一致。列表不同步以及需要从多个线程进行安全操作的事实也写在文档中:要修复代码,您需要遵循建议。
Collections.synchronizedList: