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<>();
                 }
             }
         }