java多线程中用原子变量类(如atomicinteger)替代synchronized实现线程安全,依赖cas机制;需按数据类型选用对应类,调用incrementandget等原子方法,但复合操作仍需同步。

Java 中在多线程环境下使用原子变量类(如 AtomicInteger、AtomicLong 等)进行计算,核心是用它们替代普通变量 + synchronized 或 Lock,避免显式加锁,靠底层 CAS(Compare-And-Swap)实现线程安全的数值操作。
选择合适的原子类
根据要操作的数据类型选对应原子类:
-
AtomicInteger:整型计数(如累加器、状态标志) -
AtomicLong:长整型(高并发下比AtomicInteger更适合大数值场景) -
AtomicBoolean:开关控制(如初始化完成标记) -
AtomicReference<t></t>:引用类型(如无锁栈、自定义对象状态更新) - 数组类如
AtomicIntegerArray:需对数组元素单独原子操作时使用
常用原子操作方法
避免直接读写变量,改用原子类提供的线程安全方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
get()和set(value):基础读写(非原子组合) -
incrementAndGet()/decrementAndGet():自增/自减并返回新值(最常用) -
addAndGet(delta):加一个值并返回结果(比循环调用incrementAndGet更灵活) -
compareAndSet(expected, updated):CAS 核心方法,成功返回true,失败不阻塞,可用于自定义原子逻辑 -
getAndIncrement():返回旧值再自增(类似i++)
例如统计请求总数:
private static final AtomicInteger requestCount = new AtomicInteger(0);
public void handleRequest() {
requestCount.incrementAndGet(); // 线程安全,无需 synchronized
}
注意复合操作仍需同步
原子类只保证单个操作的原子性。多个原子操作组合(如“先读再算再写”)不是原子的,可能出错:
- 错误写法:
if (counter.get() —— 判断和递增之间存在竞态 - 正确做法:用
compareAndSet重试,或改用synchronized/Lock - 更推荐用
AtomicInteger.updateAndGet(JDK 8+)封装逻辑:
counter.updateAndGet(current -> current <h3>性能与适用边界</h3> <p>原子变量在低到中等竞争下性能优于锁;但高竞争(大量线程反复 CAS 失败)时,自旋开销上升,此时 <code>LongAdder</code>(JDK 8+)更适合计数场景:</p>
-
LongAdder分段累加,最终调用sum()合并,吞吐更高,但不支持getAndIncrement()这类实时精确值操作 - 若需强一致性(如序列号生成),仍优先用
AtomicLong - 避免过度使用:简单读写且无共享修改时,不需要原子类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










