繁体   English   中英

为什么 java 中的读取操作是原子的?

[英]why the read operation in java is atomic?

public class Hello {
static volatile int a;
public static void main(String[] args) {

    a=200;
    a=100;
    a=a+1;

}}

字节码如下

0 sipush 200
3 putstatic #2 <jvm_test/Hello.a>
6 bipush 100
8 putstatic #2 <jvm_test/Hello.a>
11 getstatic #2 <jvm_test/Hello.a>
14 iconst_1
15 iadd
16 putstatic #2 <jvm_test/Hello.a>
19 return

a=200 由 sipush 200 和 putstatic #2 组成,而不是一个操作。 所以,为什么我们说这是原子的

sipush将数字 200 推入堆栈,而putstatic将堆栈顶部的值分配给类的 static 字段。

这两个字节码指令可以一起被视为原子的原因是因为“堆栈”是当前线程的堆栈; 其他线程有自己的堆栈,因此它们不能在这两条指令之间干扰线程中堆栈上的内容。

如果数字 200 的临时存储空间是其他线程可写的共享 memory,那么它确实不是线程安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM