Geo*_*rge 9 java concurrency jvm scala atomic
据我所知,引用赋值在64位JVM中是原子的.现在,我假设jvm不在内部使用原子指针对此进行建模,因为否则就不需要原子引用.所以我的问题是:
是java/Scala的"规格"中的原子引用分配并保证会发生,或者它是一个很幸运的巧合,大多数时候都是这样吗?
对于编译为JVM字节码的任何语言(例如clojure,Groovy,JRuby,JPython等),是否隐含了原子引用赋值?
如果不在内部使用原子指针,引用赋值如何是原子的?
Hol*_*ger 13
首先,引用赋值是原子的,因为规范是这样说的.除此之外,JVM实现者没有障碍来实现此约束,因为64位引用通常仅用于64位体系结构,其中原子64位分配是免费的.
您的主要困惑源于这样的假设:由于其名称,额外的"原子参考"功能意味着这一点.但是这个AtomicReference类提供了更多,因为它封装了一个volatile引用,它在多线程执行中具有更强的内存可见性保证.
具有原子引用更新并不一定意味着读取引用的线程也将看到关于通过该引用可到达的对象的字段的一致值.它保证的是,您将读取null某个线程实际存储的现有对象的引用或有效引用.如果您需要更多保证,则需要构造,如同步,volatile引用或AtomicReference.
AtomicReference还提供像或的原子更新操作.普通参考变量不可能实现这些.compareAndSetgetAndSet
原子参考分配在规格中.
对引用的写入和读取始终是原子的,无论它们是实现为32位还是64位值.
引用自JSR-133:Java(TM)内存模型和线程规范,第12节非原子处理double和long,http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf.