我有一个并发程序需要澄清。第一个程序被认为是原子的,而第二个则不是。
注意: 这里的 //
并不意味着注释 - 它们意味着它是与另一个进程同时执行的另一个进程。
这是第一个:
int x = 0, y = 0;
co
x = y + 1; // y = y + 1;
oc
上面的程序可以被视为原子的 - 但我不明白为什么会这样。但下一个程序不是。
int x = 0, y = 0;
co
x = y + 1; // y = x + 1;
oc
我知道原子操作是一种编程指令,它不可分割地改变计算机系统的状态,并且还知道从寄存器加载和存储值是典型的原子操作。那么上面发生了什么?
最佳答案
在第一种情况下,您总是会在增量之前或之后遇到 y
。由于操作是异步的,您无法分辨是哪一个,但这没有任何区别 - 唯一可观察到的效果是 x
在一种情况下比另一种情况大 1,这可能发生的情况基于两个语句的顺序。
在第二种情况下,您可能会遇到 x 和 y 的结果值与语句顺序不一致的情况,因为 x 和 y 都是在修改之前获取的。
第一种情况实际上并不是Java对“原子”的定义(并且与编译器可能生成的任何“原子”指令无关),而是简单的编程。
关于java - 为什么这个语句被认为是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10651398/