JDK 1.6文档显示了有关如何使用LocalThread<T>
的示例。我将其复制并粘贴在这里:
例如,下面的类生成每个线程本地的唯一标识符。线程的id在第一次调用UniqueThreadIdGenerator.getCurrentThreadId()
时被分配,并在后续调用中保持不变。
import java.util.concurrent.atomic.AtomicInteger;
public class UniqueThreadIdGenerator {
private static final AtomicInteger uniqueId = new AtomicInteger(0);
private static final ThreadLocal <Integer> uniqueNum =
new ThreadLocal <Integer> () {
@Override
protected Integer initialValue() {
return uniqueId.getAndIncrement();
}
};
public static int getCurrentThreadId() {
return uniqueId.get();
}
} // UniqueThreadIdGenerator
我的问题是:
当多个线程调用UniqueThreadIdGenerator.getCurrentThreadId()
时,它只返回0,因为没有初始化。不应该是这样的:
public static int getCurrentThreadId() {
return uniqueNum.get();
}
现在在第一次调用之后,它会初始化变量。
答案 0 :(得分:5)
是的,它应该是uniqueNum.get()
。 JDK 7 docs使其正确,并使用更好的名称:
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadId {
// Atomic integer containing the next thread ID to be assigned
private static final AtomicInteger nextId = new AtomicInteger(0);
// Thread local variable containing each thread's ID
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};
// Returns the current thread's unique ID, assigning it if necessary
public static int get() {
return threadId.get();
}
}
这不是初始化的问题 - 它只是完全使用错误成员的问题。即使许多代码 在原始代码中使用了uniqueNum
,getCurrentThreadId()
仍会返回“要分配的下一个ID”,而不是“为当前分配的ID”线程”。