diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java index 079831b9e..67bcdc644 100644 --- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java +++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java @@ -122,11 +122,11 @@ public void subscribeToEvent(Class systemEventClass, Clas Assert.notNull(systemEventClass, "systemEventClass"); Assert.notNull(listener, "listener"); + // MYFACES-4757 use computeIfAbsent to prevent multiple threads from creating different lists List eventInfos = globalListeners.get(systemEventClass); if (eventInfos == null) { - eventInfos = new CopyOnWriteArrayList<>(); - globalListeners.put(systemEventClass, eventInfos); + eventInfos = globalListeners.computeIfAbsent(systemEventClass, k -> new CopyOnWriteArrayList<>()); } EventInfo eventInfo = new EventInfo(); @@ -239,9 +239,9 @@ protected SystemEvent processComponentAttachedListeners(FacesContext facesContex return event; } - for (int i = 0, size = listeners.size(); i < size; i++) + // MYFACES-4757: Use for each to prevent race condition + for (SystemEventListener listener : listeners) { - SystemEventListener listener = listeners.get(i); if (listener.isListenerForSource(source)) { // Lazy construct the event; zhis same event instance must be passed to all listener instances. @@ -353,9 +353,9 @@ protected SystemEvent processGlobalListeners(FacesContext facesContext, List