diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java index 3c6c84f..33c8745 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java @@ -20,6 +20,8 @@ import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.util.LoaderUtil; @@ -37,6 +39,8 @@ public abstract class AbstractLoggerAdapter implements LoggerAdapter { */ protected final Map> registry = new WeakHashMap<>(); + private final ReadWriteLock lock = new ReentrantReadWriteLock (true); + @Override public L getLogger(final String name) { final LoggerContext context = getContext(); @@ -56,13 +60,28 @@ public abstract class AbstractLoggerAdapter implements LoggerAdapter { * @return the map of loggers for the given LoggerContext */ public ConcurrentMap getLoggersInContext(final LoggerContext context) { - synchronized (registry) { - ConcurrentMap loggers = registry.get(context); - if (loggers == null) { - loggers = new ConcurrentHashMap<>(); - registry.put(context, loggers); - } + ConcurrentMap loggers; + lock.readLock ().lock (); + try { + loggers = registry.get (context); + } finally { + lock.readLock ().unlock (); + } + + if (loggers != null) { return loggers; + } else { + lock.writeLock ().lock (); + try { + loggers = registry.get (context); + if (loggers == null) { + loggers = new ConcurrentHashMap<> (); + registry.put (context, loggers); + } + return loggers; + } finally { + lock.writeLock ().unlock (); + } } }