基本数据类型在java中是原子的

基本数据类型在java中是原子的,java,atomic,race-condition,atomicity,Java,Atomic,Race Condition,Atomicity,我了解到,布尔、字节、短、字符、int和float等基本数据类型是原子的。像long和double这样的64位数据类型不是 但这意味着什么?当我有两个线程在一个int变量上递增和递减时,有时我仍然得到竞争条件 例如,将金额添加到变量的字节码 getfield #2 <Field int amount> iload_1 iadd putfield #2 <Field int amount> getfield#2 iload_1 iadd 普特菲尔德#2 在这种情况下,原

我了解到,布尔、字节、短、字符、int和float等基本数据类型是原子的。像long和double这样的64位数据类型不是

但这意味着什么?当我有两个线程在一个int变量上递增和递减时,有时我仍然得到竞争条件

例如,将金额添加到变量的字节码

getfield #2 <Field int amount>
iload_1
iadd
putfield #2 <Field int amount>
getfield#2
iload_1
iadd
普特菲尔德#2
在这种情况下,原子是每一个操作(getfield、iadd…)而不是完整的加法吗

当我有两个线程在一个int变量上递增和递减时,有时我仍然得到竞争条件

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

在这种情况下,原子是每一个操作(getfield、iadd…)而不是完整的加法吗


是的,没错。实际上,原语类型不是原子的,而是原子的读写操作。这是一个很大的区别。

Atomic意味着更改值的操作“立即”发生,就像事务一样。这并不意味着你不会有竞态条件,只是意味着你不会因为原子性而有竞态条件。是的,我读过java原语ints是原子的,是设计的还是偶然的?但我不确定这就是为什么我问“getfield”、“iload_1”是否是原子的