[PATCH 1/1] Get rid of synchronization in java.util.logging.LogRecord constructor

David M. Lloyd david.lloyd at redhat.com
Fri Mar 13 00:12:17 UTC 2009


I couldn't think of any situation where there would be.

- DML

On 03/12/2009 06:46 PM, Martin Buchholz wrote:
> This looks fine, as long as there is no dependency of the implementation
> on the two atomic counters being incremented in concert, as seems likely.
> 
> Martin
> 
> On Thu, Mar 12, 2009 at 15:35, David M. Lloyd <david.lloyd at redhat.com> wrote:
>> Switch to atomic ops for the various sequence numbers, as opposed to
>> synchronizing on the class object on every object construction.
>>
>> - DML
>> --
>>
>> diff -r dde3fe2e8164 src/share/classes/java/util/logging/LogRecord.java
>> --- a/src/share/classes/java/util/logging/LogRecord.java        Wed Feb 25
>> 14:32:01 2009 +0000
>> +++ b/src/share/classes/java/util/logging/LogRecord.java        Thu Mar 12
>> 17:12:22 2009 -0500
>> @@ -25,6 +25,8 @@
>>
>>  package java.util.logging;
>>  import java.util.*;
>> +import java.util.concurrent.atomic.AtomicLong;
>> +import java.util.concurrent.atomic.AtomicInteger;
>>  import java.io.*;
>>
>>  /**
>> @@ -64,9 +66,9 @@
>>  */
>>
>>  public class LogRecord implements java.io.Serializable {
>> -    private static long globalSequenceNumber;
>> -    private static int nextThreadId=10;
>> -    private static ThreadLocal<Integer> threadIds = new
>> ThreadLocal<Integer>();
>> +    private static final AtomicLong globalSequenceNumber = new
>> AtomicLong();
>> +    private static final AtomicInteger nextThreadId = new
>> AtomicInteger(10);
>> +    private static final ThreadLocal<Integer> threadIds = new
>> ThreadLocal<Integer>();
>>
>>     /**
>>      * @serial Logging message level
>> @@ -144,15 +146,13 @@
>>         this.level = level;
>>         message = msg;
>>         // Assign a thread ID and a unique sequence number.
>> -        synchronized (LogRecord.class) {
>> -            sequenceNumber = globalSequenceNumber++;
>> -            Integer id = threadIds.get();
>> -            if (id == null) {
>> -                id = new Integer(nextThreadId++);
>> -                threadIds.set(id);
>> -            }
>> -            threadID = id.intValue();
>> +        sequenceNumber = globalSequenceNumber.getAndIncrement();
>> +        Integer id = threadIds.get();
>> +        if (id == null) {
>> +            id = Integer.valueOf(nextThreadId.getAndIncrement());
>> +            threadIds.set(id);
>>         }
>> +        threadID = id.intValue();
>>         millis = System.currentTimeMillis();
>>         needToInferCaller = true;
>>    }
>>
>> diff -r dde3fe2e8164 src/share/classes/java/util/logging/LogRecord.java
>> --- a/src/share/classes/java/util/logging/LogRecord.java        Wed Feb 25
>> 14:32:01 2009 +0000
>> +++ b/src/share/classes/java/util/logging/LogRecord.java        Thu Mar 12
>> 17:12:22 2009 -0500
>> @@ -25,6 +25,8 @@
>>
>>  package java.util.logging;
>>  import java.util.*;
>> +import java.util.concurrent.atomic.AtomicLong;
>> +import java.util.concurrent.atomic.AtomicInteger;
>>  import java.io.*;
>>
>>  /**
>> @@ -64,9 +66,9 @@
>>  */
>>
>>  public class LogRecord implements java.io.Serializable {
>> -    private static long globalSequenceNumber;
>> -    private static int nextThreadId=10;
>> -    private static ThreadLocal<Integer> threadIds = new
>> ThreadLocal<Integer>();
>> +    private static final AtomicLong globalSequenceNumber = new
>> AtomicLong();
>> +    private static final AtomicInteger nextThreadId = new
>> AtomicInteger(10);
>> +    private static final ThreadLocal<Integer> threadIds = new
>> ThreadLocal<Integer>();
>>
>>     /**
>>      * @serial Logging message level
>> @@ -144,15 +146,13 @@
>>         this.level = level;
>>         message = msg;
>>         // Assign a thread ID and a unique sequence number.
>> -        synchronized (LogRecord.class) {
>> -            sequenceNumber = globalSequenceNumber++;
>> -            Integer id = threadIds.get();
>> -            if (id == null) {
>> -                id = new Integer(nextThreadId++);
>> -                threadIds.set(id);
>> -            }
>> -            threadID = id.intValue();
>> +        sequenceNumber = globalSequenceNumber.getAndIncrement();
>> +        Integer id = threadIds.get();
>> +        if (id == null) {
>> +            id = Integer.valueOf(nextThreadId.getAndIncrement());
>> +            threadIds.set(id);
>>         }
>> +        threadID = id.intValue();
>>         millis = System.currentTimeMillis();
>>         needToInferCaller = true;
>>    }
>>
>>



More information about the core-libs-dev mailing list