From ca4d93ce34c3bc30ee603237aa5ddfb624813a3b Mon Sep 17 00:00:00 2001 From: Vladimir Ivanov Date: Thu, 9 Sep 2021 13:43:21 +0300 Subject: [PATCH] [3.0] Bugfix: java.util.ConcurrentModificationException at IdentityMapManager.invalidateQueryCache PROBLEM ======= ConcurrentModificationException raising while evicting shared caches. CAUSE ======= Set 'invalidations' is changing in while we iterate over it. SOLVING ======= Add thread synchronization Signed-off-by: Vladimir Ivanov --- .../internal/identitymaps/IdentityMapManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java index 5f47d3d52aa..20651978491 100644 --- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java +++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java @@ -488,8 +488,11 @@ public void invalidateQueryCache(Class classThatChanged) { } Set invalidations = this.queryResultsInvalidationsByClass.get(classThatChanged); if (invalidations != null) { - for (Object queryKey : invalidations) { - this.queryResults.remove(queryKey); + synchronized (this.queryResults) { + for (Object queryKey : invalidations) { + this.queryResults.remove(queryKey); + } + invalidations.clear(); } } Class superClass = classThatChanged.getSuperclass();