我正在查看AtomicInteger
类(找到here)的Java源代码,以查看实现JVM所需的原子基元。我注意到他们使用未记录的Unsafe
API来实现他们的原子整数操作,并且他们使用的唯一两个原语似乎是compare and swap
和compare and set
操作。并且Unsafe类将这些指令实现为本机方法,这使我相信它们正在使用在一般情况下执行这些原始操作的本机指令。然而,并非每个处理器(尽管大多数现代处理器都有)具有本地支持这些原语的指令集。现在,即使没有本机处理器支持,这些原语也可以由VM实现,以保证与其他VM线程的原子性,但不一定与其他本机线程一致。那么java是否要求本机架构上的这些原语具有有效的JVM,因此所有JVM实现都支持本机线程的原子性,或者java中的原子性只保证在java线程之间?
答案 0 :(得分:3)
JNI没有为本机线程提供任何获取Java变量地址的方法。无论是来自Java字节码还是来自本机线程,对变量的所有访问都必须通过JVM机制。所以你的问题确实没有实际意义。
Java atomics“需要相对于JVM的原子性”,“相对于JVM”是重要的 案例。
答案 1 :(得分:2)
唯一不支持CAS或LL / SC的已知操作系统是The SPARC 32 and PA-RISC。如JSR-133 Cookbook中所述(转到多处理器部分),解决方法是 从ldcw构建 。这被称为
pa-risc上唯一的原子原语是ldcw,一种测试和设置形式,你需要使用HP自动锁上的白皮书中的技术建立原子条件更新。
http://h21007.www2.hp.com/portal/download/files/unprot/itanium/spinlocks.pdf
还有关于futexes的一些信息
https://parisc.wiki.kernel.org/index.php/FutexImplementation