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

David M. Lloyd david.lloyd at redhat.com
Thu Mar 12 22:35:53 UTC 2009


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;
     }
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: LogRecord.patch
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20090312/657e3bff/LogRecord.patch>


More information about the core-libs-dev mailing list