關於Java原子性操作的理解(賦值和自增自減)

關於Java原子性操作的理解(賦值和自增自減)

賦值操作是否是原子性?

不是,不管是基礎數據類型還是引用數據類型,它都不是原子操作
int賦值int類型的賦值

booleanl類型的賦值
booleanl類型的賦值,果然JVM是將boolean當成int來處理呢,ture是1,false是0

double類型的賦值
double類型的賦值

引用類型的賦值
引用類型的賦值

由此可見,在Java中任何賦值操作都不是原子操作!它都具有先將被賦入的值加入到棧中,然後在賦值給變量。至於int a = b,這種方式的賦值則也不是原子操作,因爲他需要先load b變量的值到棧中,然後在賦值給a,如下圖所示:
int a = b
int a = b操作

自增自減操作是否是原子性的?

只有局部變量的int類型,且自增自減的幅度在-32768 ~ 32767時,局部變量的int類型的自增自減操作都是通過iinc或iinc_w一條指令完成的,而其他數據類型則一定需要有壓棧、運算、存回的操作。

自增自減
局部變量int自增自減,幅度在-32768 ~ 32767

局部變量int自增自減,幅度超過-32768 ~ 32767
局部變量int自增自減,幅度超過-32768 ~ 32767

對象成員變量的自增自減操作
對象成員變量的自增自減操作

類變量的自增自減操作
類變量的自增自減操作

byte的自增自減操作
byte的自增自減操作

其他就不一一舉例了,都是大同小異。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章