最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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 并没有直接提供 acquireAndSet 或 releaseAndSet 方法。这两个语义操作是 VarHandle(自 Java 9 引入)才正式支持的内存模型控制能力,而 AtomicInteger 的现有 API(如 getAndSet、set、weakCompareAndSetRelease 等)仅部分覆盖其行为,需通过组合或理解内存语义来对应。
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等),而非穷举所有语义组合。
相关文章
- 试玩体验《梦幻地下城:放置好时光》挂机摸鱼神器 07-28
- 三国天下归心双动召唤阵地队阵容推荐 双动召唤阵地队搭配攻略 07-28
- 遗忘之海宝箱位置推荐 遗忘之海宝箱位置在哪里 07-28
- 核纪元枪械改装五大配件部位效果一览 07-28
- 《梦幻地下城:放置好时光》挂机打书培养满红宠物 07-28
- 以撒的结合控制台打开方法-控制台详细开启步骤 07-28