This looks like the double checked locking pattern but it does not use a
temp result var. Any reason why it is not like the 'classic' DCL (see
Effective Java item 71).

Gary

---------- Forwarded message ----------
From: <[email protected]>
Date: Sun, Sep 14, 2014 at 3:00 AM
Subject: git commit: Lazily initialize singleton instances spawning threads.
To: [email protected]


Repository: logging-log4j2
Updated Branches:
  refs/heads/master b257c78af -> 2ce32db31


Lazily initialize singleton instances spawning threads.

  - See discussion in LOG4J2-819.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit:
http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2ce32db3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2ce32db3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2ce32db3

Branch: refs/heads/master
Commit: 2ce32db31a53a07914cf620df25e4c6a7e4fbdba
Parents: b257c78
Author: Matt Sicker <[email protected]>
Authored: Sun Sep 14 02:00:12 2014 -0500
Committer: Matt Sicker <[email protected]>
Committed: Sun Sep 14 02:00:12 2014 -0500

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/util/CachedClock.java  | 11 ++++++++++-
 .../logging/log4j/core/util/CoarseCachedClock.java       | 11 ++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2ce32db3/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CachedClock.java
----------------------------------------------------------------------
diff --git
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CachedClock.java
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CachedClock.java
index c4324c7..6dfb34c 100644
---
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CachedClock.java
+++
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CachedClock.java
@@ -28,7 +28,8 @@ import java.util.concurrent.locks.LockSupport;
  */
 public final class CachedClock implements Clock {
     private static final int UPDATE_THRESHOLD = 0x3FF;
-    private static final CachedClock instance = new CachedClock();
+    private static volatile CachedClock instance;
+    private static final Object INSTANCE_LOCK = new Object();
     private volatile long millis = System.currentTimeMillis();
     private volatile short count = 0;

@@ -50,6 +51,14 @@ public final class CachedClock implements Clock {
     }

     public static CachedClock instance() {
+        // LOG4J2-819: use lazy initialization of threads
+        if (instance == null) {
+            synchronized (INSTANCE_LOCK) {
+                if (instance == null) {
+                    instance = new CachedClock();
+                }
+            }
+        }
         return instance;
     }


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2ce32db3/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CoarseCachedClock.java
----------------------------------------------------------------------
diff --git
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CoarseCachedClock.java
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CoarseCachedClock.java
index 77ffa4d..9fa7b15 100644
---
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CoarseCachedClock.java
+++
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CoarseCachedClock.java
@@ -23,7 +23,8 @@ import java.util.concurrent.locks.LockSupport;
  * the cost of some accuracy.
  */
 public final class CoarseCachedClock implements Clock {
-    private static final CoarseCachedClock instance = new
CoarseCachedClock();
+    private static volatile CoarseCachedClock instance;
+    private static final Object INSTANCE_LOCK = new Object();
     // ignore IDE complaints; volatile long is fine
     private volatile long millis = System.currentTimeMillis();

@@ -50,6 +51,14 @@ public final class CoarseCachedClock implements Clock {
      * @return the singleton instance
      */
     public static CoarseCachedClock instance() {
+        // LOG4J2-819: use lazy initialization of threads
+        if (instance == null) {
+            synchronized (INSTANCE_LOCK) {
+                if (instance == null) {
+                    instance = new CoarseCachedClock();
+                }
+            }
+        }
         return instance;
     }





-- 
E-Mail: [email protected] | [email protected]
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to