您提到的字节码指令(iinc
,iload
,aload
等)对操作数堆栈和上的值进行操作局部变量。这些区域是线程本地的(参见JVMS 2.5,2.6),也就是说,这里的原子性毫无意义。即它们不是使用像lock xadd
这样的原子CPU指令实现的,但没有人应该关心。
读取或写入字段和数组元素(getfield
,putfiled
,iastore
等)的字节码指令是原子的,但long
和double
除外类型(参见JLS 17.7)。除非声明字段为volatile
,否则32位JVM可以实现(实际上,HotSpot JVM 实现)读取和写入具有两个32位加载或存储的64位字段。 / p>