我读过像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 ......)而不是完全添加吗?
答案 0 :(得分:4)
当我有2个线程在int变量上递增和递减时,有时我仍然有竞争条件。
是的,你会 - 因为即使int
变量上的“get”和“set”操作都是原子的,这并不意味着“增量”操作是原子的。
在这种情况下,每次操作都是原子(getfield,iadd ......)而不是完全添加吗?
是的,确切地说。它实际上并不是原始的类型是原子的 - 它是原子的读写操作。这是一个很大的不同。