2014-07-05 69 views
1

我讀取像boolean,byte,short,char,int和float這樣的原始數據類型是原子的。像long和double這樣的64位數據類型不是。原始數據類型在java中是原子的

但這是什麼意思?當我有2個線程在一個int變量上遞增和遞減比有時我仍然有競爭條件。例如

例如將數量添加到變量的字節碼。

getfield #2 <Field int amount> 
iload_1 
iadd 
putfield #2 <Field int amount> 

原子在這種情況下,每一個單一的操作(getfield,iadd ...),而不是全加法?

+0

給我們您的消息來源。 –

+0

原子意味着改變價值的操作就像交易一樣「立即」發生。這並不意味着你不會有競爭條件,這只是意味着你不會因爲原子能而有競爭條件。 – alfasin

+0

是的,我讀了設計或意外的原子是原子整數?但我不確定多數民衆贊成爲什麼我問清楚,如果「getfield」,「iload_1」是原子 –

回答

4

當我有2個線程增量和遞減的int變量比有時我仍然有競爭條件。

是的,你 - 因爲即使在int變量的「獲取」和「設置」操作是每個原子,這並不意味着在「增量」操作是原子。

原子在這種情況下每一個單一的操作(getfield,iadd ...),而不是全加法?

是的,正好。它實際上不是原始的類型是原子的 - 它是原子的讀寫操作。這是一個很大的區別。