一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java中 AtomicInteger 的 acquireAndSet 与 releaseAndSet 在 Java 9+ VarHandle 中的映射

时间:2026-07-21 09:22:54 编辑:袖梨 来源:一聚教程网

AtomicInteger 没有 acquireAndSet 或 releaseAndSet 方法,因其原子操作基于 CAS 和 volatile 语义,而 acquire/release 级别控制由 VarHandle 提供;AtomicInteger 的 setRelease 仅写不读,getAndSet 为 sequentially consistent,无法精确实现 acquire 或 release 单边语义的原子读-改-写。

Java 中 AtomicInteger 并没有直接提供 acquireAndSetreleaseAndSet 方法。这两个语义操作是 VarHandle(自 Java 9 引入)才正式支持的内存模型控制能力,而 AtomicInteger 的现有 API(如 getAndSetsetweakCompareAndSetRelease 等)仅部分覆盖其行为,需通过组合或理解内存语义来对应。

acquireAndSet 在 VarHandle 中的等效操作

acquireAndSet 指“以 acquire 语义写入新值,并返回旧值”。VarHandle 提供了 getAndSet 方法,但它的内存语义默认是 sequentially consistent(全序一致),比 acquire 更强;若要精确匹配 acquire 语义(即写入具有 acquire 效果,但不保证后续读写重排),VarHandle 并未暴露 acquireAndSet 这一独立方法。

实际可用的最接近方式是:

  • 使用 VarHandle.getAndSet —— 它在大多数场景下可替代,因 sequentially consistent 已隐含 acquire + release 效果;
  • 若严格追求 acquire-only 写入语义(例如与某个 acquire-read 配对形成 acquire-release 同步对),则需用 VarHandle.set 配合 VarHandle.getAcquire 手动实现逻辑,但无法原子地“读旧值+写新值”;
  • 目前(截至 Java 21,且无 JEP 提案新增)VarHandle 仍不支持 acquireAndSet 这样的原子二元操作。

releaseAndSet 在 VarHandle 中的等效操作

releaseAndSet 意味着“以 release 语义写入新值”,即该写入不会被重排到其之前的读写之后,用于发布共享状态。这在 VarHandle 中有明确对应:

立即学习“Java免费学习笔记(深入)”;

  • VarHandle.setRelease(Object, V) —— 直接支持 release 语义的设值;
  • 注意:它不返回旧值,仅执行写入;
  • 若需要“设值并返回旧值”+ release 语义,则 VarHandle 同样不提供原生方法;AtomicInteger.setRelease(int) 也只写不读,而 getAndSet 是 sequentially consistent,不是 release-only。

AtomicInteger 中已有的近似方法及其语义定位

AtomicInteger 自身 API 基于旧版原子操作抽象,其方法映射关系如下:

  • set(int) → 默认为 sequentially consistent,等价于 VarHandle.set(无显式语义标记,但 JVM 实现通常按 volatile 处理);
  • setRelease(int)(Java 9+)→ 明确对应 VarHandle.setRelease,用于 release-store;
  • getAndSet(int) → 对应 VarHandle.getAndSet,语义为 sequentially consistent,强度高于单纯的 acquire 或 release;
  • weakCompareAndSetRelease(int, int) → 使用 release 语义的 CAS 失败可能不保证原子性,对应 VarHandle.weakCompareAndSetRelease

为什么没有 acquireAndSet / releaseAndSet 的原子变体?

这是 JVM 内存模型的设计取舍:

  • 硬件层面极少提供“acquire-store”或“release-load”以外的混合原子指令;
  • 主流同步模式依赖 acquire-release 对(如 acquire-load + release-store),而非单边弱语义的原子读-改-写;
  • 因此 JMM 和 VarHandle 优先保证关键同步原语(getAcquire/setRelease/compareAndSet 等),而非穷举所有语义组合。

热门栏目