gpt4 book ai didi

java - ThreadLocal set() 然后立即 get() 并不总是获取值

转载 作者:行者123 更新时间:2023-12-01 19:50:02 25 4
gpt4 key购买 nike

我无法可靠地获取刚刚设置的 ThreadLocal 值。我尝试构建一个简单的示例来演示该问题:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class StackOverflowQuestion {

private static ThreadLocal<String> threadLocal;

public static void main(String[] args) throws Exception {
ExecutorService threadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
threadPool.execute(() -> {
threadLocal = new ThreadLocal<>();
threadLocal.set("foo");
System.out.println(threadLocal.get());
});
}
threadPool.shutdown();
threadPool.awaitTermination(10, TimeUnit.SECONDS);
}
}

输出为:

null
foo
foo
foo
foo
foo
foo
null
foo
foo

null 的位置值每次都不同。我本以为它们都是 foo 。为什么我不能设置threadLocal然后立即读取我刚刚设置的值?文档中是否有这样的说明,或者这是一个 JVM 错误?如果相关的话,我在 Windows 上使用 Oracle Java JRE 1.8.0_172。

最佳答案

您正在重复创建新的ThreadLocal

你可以想象ThreadLocal像一个Map一样工作,以当前线程为键。代码可能会导致:

threadLocal = new ThreadLocal<>(); ----> one thread create an empty ThreadLocal
threadLocal.set("foo");
System.out.println(threadLocal.get()); ----> another thread get null

您可以将其更改为:

threadPool.execute(() -> {
threadLocal.set("foo");
System.out.println(threadLocal.get());
});

关于java - ThreadLocal set() 然后立即 get() 并不总是获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51675486/

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