Oh thanks! Updated. On 14 September 2014 14:32, Ralph Goers <[email protected]> wrote:
> > http://uet.vnu.edu.vn/~chauttm/e-books/java/Effective.Java.2nd.Edition.May.2008.3000th.Release.pdf > > Ralph > > On Sep 14, 2014, at 10:45 AM, Matt Sicker <[email protected]> wrote: > > I'll have to look at the book again tomorrow (left it at work). > > On 14 September 2014 12:32, Ralph Goers <[email protected]> > wrote: > >> Yes, but take a look at the Effective Java section. What you coded works >> correctly but it accesses “instance” twice. By reading instance into a temp >> variable that isn’t volatile it claims you can get a bit of a performance >> boost since the volatile variable is accessed only once. >> >> Ralph >> >> On Sep 14, 2014, at 10:10 AM, Matt Sicker <[email protected]> wrote: >> >> 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]> >> >> >> > > > -- > Matt Sicker <[email protected]> > > > -- Matt Sicker <[email protected]>
