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.ll...@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;
>    }
>
>

Reply via email to