[英]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.