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
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>> 
>> 
>> 
>> -- 
>> Matt Sicker <[email protected]>
> 
> 
> 
> 
> -- 
> Matt Sicker <[email protected]>

Reply via email to