java - 为什么在 Java 中引用赋值是原子的?

标签 java scala concurrency jvm atomic

据我所知,引用分配在 64 位 JVM 中是原子的。 现在,我假设 jvm 在内部不使用原子指针对此进行建模,否则就不需要原子引用。所以我的问题是:

原子引用赋值是否在 java/Scala 的“规范”中并保证会发生,或者大多数时候都是这样只是一个快乐的巧合?

对于编译为 JVM 字节码的任何语言(例如 clojure、Groovy、JRuby、JPython 等),是否隐含了原子引用分配?

如果不在内部使用原子指针,引用赋值如何成为原子的?

最佳答案

首先,引用分配是原子的,因为规范是这么说的。除此之外,JVM 实现者实现此约束没有任何障碍,因为 64 位引用通常仅用于 64 位架构,其中原子 64 位分配是免费的。

您的主要困惑源于这样一种假设,即附加的“原子引用”功能恰如其名,因为它的名称。但是 AtomicReference 类提供了更多,因为它封装了一个 volatile 引用,在多线程执行中具有更强的内存可见性保证。

具有原子引用更新并不一定意味着读取引用的线程也将看到关于可通过该引用访问的对象的字段 的一致值。它只保证您将读取 null 引用或对某个线程实际存储的现有对象的有效引用。如果您想要更多保证,则需要诸如同步、volatile 引用或 AtomicReference 之类的结构。

AtomicReference 还提供原子更新 操作,例如compareAndSetgetAndSet。这些对于使用内置语言结构的普通引用变量是不可能的(但只有像 AtomicReferenceFieldUpdaterVarHandle 这样的特殊类)。

关于java - 为什么在 Java 中引用赋值是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44283378/

相关文章:

java - eclipse中的spring petclinic编译错误

java - 如何增加从java数据库中获取特定值的时间?

scala - 匹配没有参数列表的案例类

regex - 在 Scala 中的给定索引之后查找字符串中的正则表达式匹配

c - 在没有人等待时发出条件变量信号的意义?

c# - Websocket 服务器最大并发连接 C#

java - 使用 java + selenium WebDriver 获取一些文本

java - CORS 的 Spring 实现没有在我预期的时候拒绝消息

带有 VScode 的 Scala

java - 从调用线程运行 CompletableFuture.thenAccept ?