java - 为什么这个语句被认为是原子的?

标签 java concurrency atomic

我有一个并发程序需要澄清。第一个程序被认为是原子的,而第二个则不是。

注意: 这里的 // 并不意味着注释 - 它们意味着它是与另一个进程同时执行的另一个进程。

这是第一个:

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/

相关文章:

c# - 为什么 Concurrent Whatever.Count 会截取快照

java - 匿名类型的类型

multithreading - 是否可以同时写入相同的数据集文件但写入不同的命名图(每个线程写入不同的命名图)?

java - 如果不在方括号或圆括号内,则用逗号分隔字符串

java - 消息线程安全

python - 如何从 Mongoengine/Pymongo 中的字典中自动删除键?

c++ - Linux 上 C++ 中线程/共享内存之间的线程安全数据交换

java - 并发HashMap和原子值

java - 如何使用 Application.properties 文件在 Spring Boot 应用程序中设置多个 View 解析器

java - JPA EntityManager 不一致地将对象添加到数据库