首页 文章

Java Atomics是否仅需要与VM相关的原子性

提问于
浏览
6

我正在查看 AtomicInteger 类(找到here)的Java源代码,以查看实现JVM所需的原子基元 . 我注意到他们使用未记录的 Unsafe API来实现他们的原子整数操作,并且他们使用的唯一两个原语似乎是 compare and swapcompare and set 操作 . 而Unsafe类将这些指令实现为本机方法,这使我相信它们正在使用在一般情况下执行这些原始操作的本机指令 . 然而,并非每个处理器(尽管大多数现代处理器都有)具有本地支持这些原语的指令集 . 现在,即使没有本机处理器支持,这些原语也可以由VM实现,以保证与其他VM线程的原子性,但不一定与其他本机线程一致 . 那么java是否要求本机架构上的这些原语具有有效的JVM,因此所有JVM实现都支持本机线程的原子性,或者java中的原子性只保证在java线程之间?

2 回答

  • 2

    JNI没有为本机线程提供获取Java变量地址的任何方法 . 无论是来自Java字节码还是来自本机线程,对变量的所有访问都必须通过JVM机制 . 所以你的问题确实没有实际意义 .

    Java atomics "require atomicity with respect to the JVM"和"with respect to the JVM"是唯一重要的案例 .

  • 3

    唯一不支持CAS或LL / SC的已知操作系统是The SPARC 32 and PA-RISC . 如JSR-133 Cookbook(转至多处理器部分)中所述,此分辨率为 build from 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

相关问题