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