From 46ec9916df0c8de14b43773f9da697040117886e Mon Sep 17 00:00:00 2001 From: melloware Date: Sat, 20 Jun 2026 11:10:50 -0400 Subject: [PATCH 1/2] MYFACES-4757: 5.0 Fix race conditions of CopyOnWriteList --- .../application/ApplicationImplEventManager.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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..c860aa330 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"); - List eventInfos = globalListeners.get(systemEventClass); + // 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 Date: Sun, 21 Jun 2026 07:35:39 -0400 Subject: [PATCH 2/2] MYFACES-4757: 5.0 Fix race conditions of CopyOnWriteList --- .../apache/myfaces/application/ApplicationImplEventManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c860aa330..67bcdc644 100644 --- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java +++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java @@ -123,7 +123,7 @@ public void subscribeToEvent(Class systemEventClass, Clas Assert.notNull(listener, "listener"); // MYFACES-4757 use computeIfAbsent to prevent multiple threads from creating different lists - List eventInfos = globalListeners.get(systemEventClass); + List eventInfos = globalListeners.get(systemEventClass); if (eventInfos == null) { eventInfos = globalListeners.computeIfAbsent(systemEventClass, k -> new CopyOnWriteArrayList<>());