我查看了AtomicInteger类(发现这里)的Java源代码,以了解实现JVM需要哪些原子原语。我注意到他们使用无文档的Unsafe API来实现他们的原子整数操作,并且他们使用的唯一两个原语似乎是compare and swap和compare and set操作。不安全类将这些指令实现为本机方法,这使我相信它们使用的是在一般情况下执行这些原始操作的本机指令。然而,并不是每个处理器(尽管大多数现代处理器都有)都有支持这些原语的指令集。现在,即使没有本机处理器的支持,这些原语也可以由VM以保证与其他VM线程具有原子性的方式实现,但不一定与其他本机线程一起实现。那么,java是否要求本机架构上的这些原语具有有效的JVM,因此所有JVM实现都将支持本机线程的原子性,还是java中的原子性仅在java线程之间得到保证?
发布于 2015-05-06 16:16:20
JNI不为本机线程提供获取Java变量地址的任何方法。所有对变量的访问,无论是从Java字节码还是从本机线程,都必须通过JVM机器进行。所以你的问题真的毫无意义。
Java“要求JVM具有原子性”,而“相对于JVM”是唯一重要的情况。
发布于 2015-05-06 15:34:59
唯一不支持CAS或LL/SC的操作系统是SPARC 32和。正如JSR-133烹饪本 (转到多处理器部分)中所记录的那样,解决这个问题的方法是从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
https://stackoverflow.com/questions/30079020
复制相似问题