Do Java Atomics 只需要相对于 VM 的原子性
Do Java Atomics only require atomicity with respect to the VM
我正在查看 AtomicInteger
class(找到 here)的 Java 源代码,以了解实现 JVM 需要哪些原子原语。我注意到他们使用未记录的 Unsafe
API 来实现他们的原子整数操作,并且他们使用的唯一两个原语似乎是 compare and swap
和 compare and set
操作。并且 Unsafe class 将这些指令实现为本机方法,这使我相信它们正在使用在一般情况下执行这些原始操作的本机指令。然而,并非每个处理器(尽管大多数现代处理器都有)都有一个原生支持这些原语的指令集。现在,即使没有本机处理器支持,这些原语也可以由 VM 以保证与其他 VM 线程的原子性的方式实现,但不一定与其他本机线程。 java 是否要求本机架构上的这些原语具有有效的 JVM,因此所有 JVM 实现都将支持本机线程的原子性,或者 java 中的原子性仅在 java 线程之间得到保证?
唯一不支持 CAS 或 LL/SC 的已知 OS 是 The SPARC 32 and PA-RISC. As documented in the JSR-133 Cookbook(转到多处理器部分),解决方案是 从 ldcw 构建。表示为
The only atomic primitive on pa-risc is ldcw, a form of test-and-set, from which you would need to build up atomic conditional updates using techniques such as those in the HP white paper on spinlocks.
http://h21007.www2.hp.com/portal/download/files/unprot/itanium/spinlocks.pdf
还有一些关于 futexes 的信息
https://parisc.wiki.kernel.org/index.php/FutexImplementation
JNI 不提供任何方法让本机线程获取 Java 变量的地址。所有对变量的访问,无论是来自 Java 字节码还是来自本机线程,都必须通过 JVM 机制。所以你的问题真的没有实际意义。
Java 原子 "require atomicity with respect to the JVM",而 "with respect to the JVM" 是 只有 重要的情况。
我正在查看 AtomicInteger
class(找到 here)的 Java 源代码,以了解实现 JVM 需要哪些原子原语。我注意到他们使用未记录的 Unsafe
API 来实现他们的原子整数操作,并且他们使用的唯一两个原语似乎是 compare and swap
和 compare and set
操作。并且 Unsafe class 将这些指令实现为本机方法,这使我相信它们正在使用在一般情况下执行这些原始操作的本机指令。然而,并非每个处理器(尽管大多数现代处理器都有)都有一个原生支持这些原语的指令集。现在,即使没有本机处理器支持,这些原语也可以由 VM 以保证与其他 VM 线程的原子性的方式实现,但不一定与其他本机线程。 java 是否要求本机架构上的这些原语具有有效的 JVM,因此所有 JVM 实现都将支持本机线程的原子性,或者 java 中的原子性仅在 java 线程之间得到保证?
唯一不支持 CAS 或 LL/SC 的已知 OS 是 The SPARC 32 and PA-RISC. As documented in the JSR-133 Cookbook(转到多处理器部分),解决方案是 从 ldcw 构建。表示为
The only atomic primitive on pa-risc is ldcw, a form of test-and-set, from which you would need to build up atomic conditional updates using techniques such as those in the HP white paper on spinlocks.
http://h21007.www2.hp.com/portal/download/files/unprot/itanium/spinlocks.pdf
还有一些关于 futexes 的信息
https://parisc.wiki.kernel.org/index.php/FutexImplementation
JNI 不提供任何方法让本机线程获取 Java 变量的地址。所有对变量的访问,无论是来自 Java 字节码还是来自本机线程,都必须通过 JVM 机制。所以你的问题真的没有实际意义。
Java 原子 "require atomicity with respect to the JVM",而 "with respect to the JVM" 是 只有 重要的情况。