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

Kyl*_*oN- 2 java atomic race-condition atomicity

我读到原始数据类型,如布尔,字节,短,字符,整数和浮点数都是原子的。像long和double这样的64位数据类型则不是。

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

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

getfield #2 <Field int amount>
iload_1
iadd
putfield #2 <Field int amount>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,原子操作是否是每个单个操作(getfield,iadd ...),而不是全部加法?

Jon*_*eet 5

当我有2个在int变量上递增和递减的线程时,有时我仍会遇到竞态条件。

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

在这种情况下,原子操作是否是每个单个操作(getfield,iadd ...),而不是全部加法?

对,就是这样。实际上,原始类型不是原子的-它是原子的读取和写入操作。那是很大的不同。