LOG4J2-3103: Make listeners in LoggerContext a CopyOnWriteArrayList (#508)
This particular case fails quite often in integration tests
where you have multiple separate threads potentially creating
and destroying the singleton LoggerContext independently.
Since this is a Listener List, it makes sense to just make
it a CopyOnWriteArrayList, since the frequency of both
occurring is going to be roughly equivalent.
Co-authored-by: Mike Glazer <mglazer@palantir.com>
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
index b2ff3aa..e9487c9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
@@ -22,9 +22,7 @@
import java.beans.PropertyChangeListener;
import java.io.File;
import java.net.URI;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@@ -176,7 +174,7 @@
if (listeners == null) {
synchronized(this) {
if (listeners == null) {
- listeners = Collections.synchronizedList(new ArrayList<>());
+ listeners = new CopyOnWriteArrayList<>();
}
}
}