Because volatile works properly in Java 1.6? At least that's what I gathered the last time I discussed this with Ralph.
On 14 September 2014 09:39, Gary Gregory <[email protected]> wrote: > 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 > -- Matt Sicker <[email protected]>
