提交 7ff664c7 编写于 作者: M martin

6278014: java.util.logging.LogRecord.getThreadID() should provide real thread id

Summary: Make j.u.l. thread id a copy of Thread's id, for small values of thread id.
Reviewed-by: alanb
上级 6f6e1cd6
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
package java.util.logging; package java.util.logging;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.io.*; import java.io.*;
/** /**
...@@ -64,9 +66,24 @@ import java.io.*; ...@@ -64,9 +66,24 @@ import java.io.*;
*/ */
public class LogRecord implements java.io.Serializable { public class LogRecord implements java.io.Serializable {
private static long globalSequenceNumber; private static final AtomicLong globalSequenceNumber
private static int nextThreadId=10; = new AtomicLong(0);
private static ThreadLocal<Integer> threadIds = new ThreadLocal<Integer>();
/**
* The default value of threadID will be the current thread's
* thread id, for ease of correlation, unless it is greater than
* MIN_SEQUENTIAL_THREAD_ID, in which case we try harder to keep
* our promise to keep threadIDs unique by avoiding collisions due
* to 32-bit wraparound. Unfortunately, LogRecord.getThreadID()
* returns int, while Thread.getId() returns long.
*/
private static final int MIN_SEQUENTIAL_THREAD_ID = Integer.MAX_VALUE / 2;
private static final AtomicInteger nextThreadId
= new AtomicInteger(MIN_SEQUENTIAL_THREAD_ID);
private static final ThreadLocal<Integer> threadIds
= new ThreadLocal<Integer>();
/** /**
* @serial Logging message level * @serial Logging message level
...@@ -122,6 +139,23 @@ public class LogRecord implements java.io.Serializable { ...@@ -122,6 +139,23 @@ public class LogRecord implements java.io.Serializable {
private transient Object parameters[]; private transient Object parameters[];
private transient ResourceBundle resourceBundle; private transient ResourceBundle resourceBundle;
/**
* Returns the default value for a new LogRecord's threadID.
*/
private int defaultThreadID() {
long tid = Thread.currentThread().getId();
if (tid < MIN_SEQUENTIAL_THREAD_ID) {
return (int) tid;
} else {
Integer id = threadIds.get();
if (id == null) {
id = nextThreadId.getAndIncrement();
threadIds.set(id);
}
return id;
}
}
/** /**
* Construct a LogRecord with the given level and message values. * Construct a LogRecord with the given level and message values.
* <p> * <p>
...@@ -144,15 +178,8 @@ public class LogRecord implements java.io.Serializable { ...@@ -144,15 +178,8 @@ public class LogRecord implements java.io.Serializable {
this.level = level; this.level = level;
message = msg; message = msg;
// Assign a thread ID and a unique sequence number. // Assign a thread ID and a unique sequence number.
synchronized (LogRecord.class) { sequenceNumber = globalSequenceNumber.getAndIncrement();
sequenceNumber = globalSequenceNumber++; threadID = defaultThreadID();
Integer id = threadIds.get();
if (id == null) {
id = new Integer(nextThreadId++);
threadIds.set(id);
}
threadID = id.intValue();
}
millis = System.currentTimeMillis(); millis = System.currentTimeMillis();
needToInferCaller = true; needToInferCaller = true;
} }
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 6830220 * @bug 6830220 6278014
* @summary Test Logger subclasses * @summary Test Logger subclasses
*/ */
...@@ -68,6 +68,8 @@ public class LoggerSubclass { ...@@ -68,6 +68,8 @@ public class LoggerSubclass {
l.getSequenceNumber()); l.getSequenceNumber());
equal(lastThreadID.get(), equal(lastThreadID.get(),
l.getThreadID()); l.getThreadID());
equal((int) Thread.currentThread().getId(),
l.getThreadID());
} }
lastSequenceNumber.set(l.getSequenceNumber()); lastSequenceNumber.set(l.getSequenceNumber());
lastThreadID.set(l.getThreadID()); lastThreadID.set(l.getThreadID());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册