gpt4 book ai didi

java - 为什么这个同步程序返回错误的结果?

转载 作者:行者123 更新时间:2023-12-01 20:05:22 24 4
gpt4 key购买 nike

为了了解 Java 同步的工作原理,我编写了一个简单的示例程序,它使用四个线程计算数组的总和。我知道它不是很有效,但似乎它应该可以工作,因为我使用了锁:

public class ConcurrencyTest1 {

static Object lock = new Object();
static volatile int sum;

public static void main(String[] args) {
int[] array = new int[40000];
Arrays.fill(array, 1);

sum = 0;

new Thread( ()-> {
for (int i=0;i<10000;++i)
synchronized(lock) {
sum += array[i];
}
} ).start();

new Thread( ()-> {
for (int i=10000;i<20000;++i)
synchronized(lock) {
sum += array[i];
}
} ).start();

new Thread( ()-> {
for (int i=20000;i<30000;++i)
synchronized(lock) {
sum += array[i];
}
} ).start();

for (int i=30000;i<40000;++i)
synchronized(lock) {
sum += array[i];
}

System.out.println(sum);
}

}

正确答案是 40000。但是,当我运行多次时,我经常得到较小的数字,例如 37713 或 30000。为什么?

最佳答案

您的main程序线程启动4个线程,然后打印总和。它不会等待这些线程完成其工作。使其工作的最小改变是:

Thread t1 = new Thread(()-> {
for (int i=0;i<10000;++i)
synchronized(lock) {
sum += array[i];
}
});
...
t1.start();
....

t1.join();
...
t4.join();

System.out.println(sum);

关于java - 为什么这个同步程序返回错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47497626/

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