gpt4 book ai didi

Java 并发数 : weird output

转载 作者:行者123 更新时间:2023-11-29 06:55:04 27 4
gpt4 key购买 nike

我正在研究 Java 线程,我编写了这个创建多个线程并运行它们的小程序。在每个线程中,一个值会递增多次。我使用了 ThreadLocal 类,这样就不会出现资源争用。

来源:

class MyValueHolder {

public static ThreadLocal<Integer> value = new ThreadLocal<Integer>()
{
protected Integer initialValue() {
return 0;
}
};

public static void increment() {
value.set(value.get() + 1);
}

public static Integer get() {
return value.get();
}
}

class MyTask implements Runnable {

public static int counter;

public MyTask() {
counter++;
}

public void run() {

for(int i = 0; i < 100; i++) {
MyValueHolder.increment();
}
System.out.println("MyTask " + counter + ", Value " + MyValueHolder.get());
}
}

public class Main {

public static void main(String[] args) {

ExecutorService es = Executors.newCachedThreadPool();

for(int i = 0; i < 5; i++) {

es.execute(new MyTask());
}

es.shutdownNow();
}
}

完成后大部分时间输出是这样的:

MyTask 5, Value 100
MyTask 5, Value 100
MyTask 5, Value 100
MyTask 5, Value 100
MyTask 5, Value 100

这是我希望看到的。

但是,有时我会得到这样的结果:

MyTask 2, Value 100
MyTask 4, Value 200
MyTask 5, Value 300
MyTask 5, Value 100
MyTask 5, Value 100

现在这很令人困惑。为什么即使每个任务做完全相同的事情,值也会不同?

最佳答案

如果 Runnable 在您添加所有 Runnable 之前完成,则 CachedThreadPoolExecutor 会重用线程。如果发生这种情况,该线程的 ThreadLocal 也将被重用。

关于Java 并发数 : weird output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36119039/

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