### Eclipse Workspace Patch 1.0 #P log4j2 Index: api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java =================================================================== --- api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java (revision 1439358) +++ api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java (working copy) @@ -16,9 +16,12 @@ */ package org.apache.logging.log4j.spi; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.apache.logging.log4j.ThreadContext; + /** * */ @@ -52,12 +55,15 @@ if (!useMap) { return; } - Map map = localMap.get(); - if (map == null) { - map = new HashMap(); - localMap.set(map); - } - map.put(key, value); + final Map map = localMap.get(); + Map copy = null; // copy on write + if (map == null) { + copy = new HashMap(); + } else { + copy = new HashMap(map); + } + copy.put(key, value); + localMap.set(copy); } /** @@ -79,8 +85,11 @@ */ public void remove(final String key) { final Map map = localMap.get(); + Map copy = null; if (map != null) { - map.remove(key); + copy = new HashMap(map); // copy on write + copy.remove(key); + localMap.set(copy); } } @@ -109,6 +118,16 @@ final Map map = localMap.get(); return map == null ? new HashMap() : new HashMap(map); } + /** + * Get an immutable copy of the current thread's context Map. + * @return An immutable copy of the ThreadContext Map. + */ + public Map getImmutableContext() { + final Map map = localMap.get(); + + // no need to make a deep copy here, improves performance a lot + return map == null ? ThreadContext.EMPTY_MAP : Collections.unmodifiableMap(map); + } /** * Return the context Map.