Repository: logging-log4j2 Updated Branches: refs/heads/master 7fea56d5e -> cc71a2576
[LOG4J2-2214] Unnecessary contention in DefaultThreadContextMap. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/cc71a257 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/cc71a257 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/cc71a257 Branch: refs/heads/master Commit: cc71a257617a1dd859998de9bd922bb6ea88b42a Parents: 7fea56d Author: Gary Gregory <[email protected]> Authored: Tue Jan 23 15:40:04 2018 -0700 Committer: Gary Gregory <[email protected]> Committed: Tue Jan 23 15:40:04 2018 -0700 ---------------------------------------------------------------------- .../log4j/spi/DefaultThreadContextMap.java | 28 +++++++++++++------- .../log4j/spi/ThreadContextMapFactory.java | 1 + .../log4j/spi/DefaultThreadContextMapTest.java | 2 ++ src/changes/changes.xml | 3 +++ 4 files changed, 24 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cc71a257/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java index 3513074..9f4c351 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java @@ -42,21 +42,16 @@ public class DefaultThreadContextMap implements ThreadContextMap, ReadOnlyString private final boolean useMap; private final ThreadLocal<Map<String, String>> localMap; - public DefaultThreadContextMap() { - this(true); - } - - public DefaultThreadContextMap(final boolean useMap) { - this.useMap = useMap; - this.localMap = createThreadLocalMap(useMap); + private static boolean InheritableMap; + + static { + init(); } // LOG4J2-479: by default, use a plain ThreadLocal, only use InheritableThreadLocal if configured. // (This method is package protected for JUnit tests.) static ThreadLocal<Map<String, String>> createThreadLocalMap(final boolean isMapEnabled) { - final PropertiesUtil managerProps = PropertiesUtil.getProperties(); - final boolean inheritable = managerProps.getBooleanProperty(INHERITABLE_MAP); - if (inheritable) { + if (InheritableMap) { return new InheritableThreadLocal<Map<String, String>>() { @Override protected Map<String, String> childValue(final Map<String, String> parentValue) { @@ -70,6 +65,19 @@ public class DefaultThreadContextMap implements ThreadContextMap, ReadOnlyString return new ThreadLocal<>(); } + static void init() { + InheritableMap = PropertiesUtil.getProperties().getBooleanProperty(INHERITABLE_MAP); + } + + public DefaultThreadContextMap() { + this(true); + } + + public DefaultThreadContextMap(final boolean useMap) { + this.useMap = useMap; + this.localMap = createThreadLocalMap(useMap); + } + @Override public void put(final String key, final String value) { if (!useMap) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cc71a257/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java index 05c0e2d..c67fbcd 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java @@ -64,6 +64,7 @@ public final class ThreadContextMapFactory { public static void init() { CopyOnWriteSortedArrayThreadContextMap.init(); GarbageFreeSortedArrayThreadContextMap.init(); + DefaultThreadContextMap.init(); initPrivate(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cc71a257/log4j-api/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java index 71726f0..e3ad5d6 100644 --- a/log4j-api/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java +++ b/log4j-api/src/test/java/org/apache/logging/log4j/spi/DefaultThreadContextMapTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.Map; +import org.apache.logging.log4j.ThreadContext; import org.junit.Test; /** @@ -223,6 +224,7 @@ public class DefaultThreadContextMapTest { @Test public void testThreadLocalInheritableIfConfigured() { System.setProperty(DefaultThreadContextMap.INHERITABLE_MAP, "true"); + ThreadContextMapFactory.init(); try { final ThreadLocal<Map<String, String>> threadLocal = DefaultThreadContextMap.createThreadLocalMap(true); assertTrue(threadLocal instanceof InheritableThreadLocal<?>); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cc71a257/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c918d0d..728b0ba 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -137,6 +137,9 @@ <action issue="LOG4J2-2213" dev="ggregory" type="update" due-to="Daniel Feist, Gary Gregory"> Unnecessary contention in GarbageFreeSortedArrayThreadContextMap. </action> + <action issue="LOG4J2-2214" dev="ggregory" type="update" due-to="Daniel Feist, Gary Gregory"> + Unnecessary contention in DefaultThreadContextMap. + </action> <!-- <action issue="LOG4J2-2205" dev="ggregory" type="update" due-to="Björn Kautler"> New module log4j-mongodb3: Remove use of deprecated MongoDB APIs and code to the Java driver version 3 API.
