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 指“以 acquire 语义写入新值,并返回旧值”。VarHandle 提供了 getAndSet 方法,但它的内存语义默认是 sequentially consistent(全序一致),比 acquire 更强;若要精确匹配 acquire 语义(即写入具有 acquire 效果,但不保证后续读写重排),VarHandle 并未暴露 acquireAndSet 这一独立方法。
实际可用的最接近方式是:
VarHandle.getAndSet —— 它在大多数场景下可替代,因 sequentially consistent 已隐含 acquire + release 效果;VarHandle.set 配合 VarHandle.getAcquire 手动实现逻辑,但无法原子地“读旧值+写新值”;VarHandle 仍不支持 acquireAndSet 这样的原子二元操作。releaseAndSet 意味着“以 release 语义写入新值”,即该写入不会被重排到其之前的读写之后,用于发布共享状态。这在 VarHandle 中有明确对应:
立即学习“Java免费学习笔记(深入)”;
VarHandle.setRelease(Object, V) —— 直接支持 release 语义的设值;VarHandle 同样不提供原生方法;AtomicInteger.setRelease(int) 也只写不读,而 getAndSet 是 sequentially consistent,不是 release-only。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。这是 JVM 内存模型的设计取舍:
VarHandle 优先保证关键同步原语(getAcquire/setRelease/compareAndSet 等),而非穷举所有语义组合。