gpt4 book ai didi

java - 为什么Java基本变量赋值不是原子的

转载 作者:太空宇宙 更新时间:2023-11-04 10:51:14 25 4
gpt4 key购买 nike

全部。我运行以下代码来测试Java基本变量赋值是否是原子的。

public class Test  {
static int x = 1 << 16 - 1, y = -1 << 16, i = x;
static volatile boolean flag = false;
public static void main(String... args) {
ExecutorService executors = Executors.newFixedThreadPool(3);
executors.execute(() -> {
while (true) {
if (flag) {
return;
}
i = x;
}
});
executors.execute(() -> {
while (true) {
if (flag) {
return;
}
i = y;
}
});
executors.execute(() -> {
while (true) {
if (i != x && i != y && (flag = true)) {
System.out.println(i + "," + x + "," + y);
throw new RuntimeException("Not Equal!!");
}
}
});
}

它会抛出一个新的异常(跟随文本),但是当条件(i != x && i != y)为true时我无法捕获实际的i,因为其他线程会同时修改变量i。

Exception in thread "pool-1-thread-3" java.lang.RuntimeException: Not Equal!!
at common.Test.lambda$main$2(Test.java:31)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

32768,32768,-65536

有人可以提供一些有用的建议来帮助我找出实际的 i 导致 (if (i != x && i != y && (flag = true)) 为 true 吗?

最佳答案

您看到的问题并不是因为 int 赋值不是原子的:它是!

由于您正在从多个线程修改 i ,因此所有对其的读取和写入都应该同步,否则线程可能会获得过时的值,这就是您的情况发生的情况,例如:

  1. 赋值i = y
  2. 评估此条件:if (i != x && i != y && (flag = true))
  3. i != x 被评估并返回 true
  4. 赋值i = x
  5. i != y 被评估并返回 true
  6. 我们在if

关于java - 为什么Java基本变量赋值不是原子的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47826482/

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