原始数据类型在java中是原子的

时间:2014-07-05 07:55:05

标签: java atomic race-condition atomicity

我读过像boolean,byte,short,char,int和float这样的原始数据类型是原子的。 64位数据类型(如long和double)不是。

但这是什么意思?当我有2个线程在int变量上递增和递减时,有时我仍然有竞争条件。

例如,向变量添加金额的字节码。

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

在这种情况下,每次操作都是原子(getfield,iadd ......)而不是完全添加吗?

1 个答案:

答案 0 :(得分:4)

  

当我有2个线程在int变量上递增和递减时,有时我仍然有竞争条件。

是的,你会 - 因为即使int变量上的“get”和“set”操作都是原子的,这并不意味着“增量”操作是原子的。

  

在这种情况下,每次操作都是原子(getfield,iadd ......)而不是完全添加吗?

是的,确切地说。它实际上并不是原始的类型是原子的 - 它是原子的读写操作。这是一个很大的不同。