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.

Reply via email to