gpt4 book ai didi

java - 一个简单的 Java 竞争条件

转载 作者:行者123 更新时间:2023-11-30 07:23:56 25 4
gpt4 key购买 nike

我只是想写一个竞争条件的例子:

MyParallelClass.java:

public class MyParallelClass implements java.lang.Runnable {
public int counter = 0;

@Override
public void run() {
if (test.globalVar > 0) {
for (int i = 0; i < 1000000; i++) {
counter++;
}
test.globalVar--;
}
}
}

测试.java:

public class test {
public static int globalVar;

public static void main(String[] args) {
globalVar = 1;

MyParallelClass a = new MyParallelClass();
MyParallelClass b = new MyParallelClass();

new Thread(a).start(); // Thread A
new Thread(b).start(); // Thread B

System.out.println(globalVar);
}
}

我认为会发生什么:

我认为如果线程 A 在线程 B 启动之前完全执行,这可能会输出 0

变量 test.globalVar 也可以这样操作:

Thread A                     -  Thread B  
checks if (globalVar > 0)
looping ... checks if (globalVar > 0)
looping ... execute all four bytecode commands of "test.globalVar--;"
execute test.globalVar--;

因此 test.globalVar 的值将是 -1

因此,要么执行其中一个 if 语句,要么同时执行两者。

实际发生了什么:

我得到 01 作为主要方法的输出。为什么我得到的是 01 而不是 0-1

最佳答案

您正在递减 globalVar 两次。末尾 globalVar 的可能值是:

  • -1 - 如果一切顺利并且两个线程在打印之前正确地递减了该值

  • 0:

    • 如果只有一个线程设法递减变量,而第二个线程在打印之前未能完成

    • 如果 globalVar 同时递减

  • 1:

    • 如果 System.out.println() 设法在两个线程完成之前执行(很有可能)。 globalVar 确实被修改了,但是它已经被打印出来了

    • 由于可见性问题,main 线程看到的是原始 globalVar 值,而不是被不同线程修改的值。您需要某种同步或 volatile 关键字才能立即(或永远)看到其他线程所做的更改。

关于java - 一个简单的 Java 竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11728277/

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