据我所知,引用赋值在64位JVM中是原子的。 现在,我假设jvm没有在内部使用原子指针对此进行建模,因为否则就不需要原子参考。所以我的问题是:
" specs&#34>中的原子参考分配java / Scala并保证会发生这种情况,或者只是一次巧合的巧合,大多数时候都是这样吗?
是否为任何编译为JVM字节码的语言(例如clojure,Groovy,JRuby,JPython等)隐含了原子引用赋值?
如果不在内部使用原子指针,引用赋值如何是原子的?
答案 0 :(得分:10)
首先,引用赋值是原子的,因为规范是这样说的。除此之外,JVM实现者没有障碍来实现这一约束,因为64位引用通常仅用于64位体系结构,其中原子64位分配是免费的。
您的主要困惑源于这样的假设:由于其名称,额外的“原子参考”功能意味着这一点。但是ID
类提供了更多,因为它封装了一个AtomicReference
引用,它在多线程执行中具有更强的内存可见性保证。
进行原子引用更新并不一定意味着读取引用的线程也会看到有关通过该引用可访问的对象的 fields 的一致值。它保证的是,您将读取volatile
引用或对某个线程实际存储的现有对象的有效引用。如果您需要更多保证,则需要构建同步,null
引用或volatile
。
AtomicReference
还提供原子更新操作,例如AtomicReference
或compareAndSet
。普通的参考变量是不可能的。
答案 1 :(得分:6)
原子参考分配在规格中。
写入和读取引用始终是原子的,无论如何 它们是实现为32位还是64位值。
引自 JSR-133:Java(TM)内存模型和线程规范,第12节 double
和long
,http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf。
答案 2 :(得分:3)
正如其他答案所述,Java Memory Model声明引用读/写是原子的。
但当然,这是Java 语言内存模型。另一方面:无论我们是在谈论Java还是Scala或Kotlin,还是......最终所有内容都被编译成字节码。
Java没有特殊的字节码指令。 Scala最终使用了相同的指令。
导致:该内存模型的属性必须在VM平台内部中实现。因此,他们必须也适用于在平台上运行的其他语言。