gpt4 book ai didi

java - JDK 中的 ThreadLocal 文档

转载 作者:行者123 更新时间:2023-12-01 17:34:32 24 4
gpt4 key购买 nike

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();
}

现在,在第一次调用之后,它会初始化变量。

最佳答案

是的,应该是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();
}
}

这实际上并不是初始化的问题 - 这只是完全使用错误成员的问题。即使许多代码在原始代码中使用了 uniqueNumgetCurrentThreadId() 也始终会返回“要分配的下一个 ID” “为当前线程分配的ID”。

关于java - JDK 中的 ThreadLocal<T> 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com