乐观锁是数据库或应用层的并发控制策略,依赖版本号或时间戳实现“先检查再更新”;CAS是CPU原子指令,由JVM通过Unsafe封装,直接操作内存变量,用于JVM内多线程无锁更新。

乐观锁和 CAS 都基于“先检查再更新”的思想,但它们作用的层级、实现机制和适用场景完全不同。
作用层级不同:数据库 vs 内存
乐观锁是数据库(或应用层模拟)用于并发控制的逻辑策略,通常在 SQL 层面配合版本号或时间戳字段实现;CAS 是 CPU 提供的原子指令(如 cmpxchg),由 JVM 将其封装为 Unsafe.compareAndSwapInt 等方法,直接操作内存中的变量。
前者解决的是跨事务、跨请求的数据一致性问题;后者解决的是单 JVM 进程内多线程对共享变量的无锁更新问题。
实现方式不同:SQL 逻辑 vs 硬件指令
数据库乐观锁典型写法:
立即学习“Java免费学习笔记(深入)”;
UPDATE account SET balance = ? , version = version + 1 WHERE id = ? AND version = ?;
执行成功才代表“检查通过+更新完成”,否则需重试。整个过程依赖数据库事务和 WHERE 条件的原子性。
CAS 操作示例(如 AtomicInteger):
boolean updated = atomicInt.compareAndSet(expected, newValue);
这行代码对应一条 CPU 原子指令,在寄存器级别完成“读-比-写”三步不可分割的操作,不依赖锁或事务。
失败处理不同:业务重试 vs 调用方自循环
- 数据库乐观锁失败时,通常抛出异常或返回影响行数为 0,应用需捕获并决定是否重读数据、重新计算后再次提交
- CAS 失败只返回
false,JVM 类库(如ConcurrentHashMap)或业务代码往往用 while 循环反复尝试,直到成功——这种模式叫“自旋” - 两者都可能无限重试,所以实际使用中都要考虑退出条件或降级策略(比如限制最大重试次数)
一致性保障范围不同:全局持久化 vs 进程局部
数据库乐观锁依托事务日志和磁盘持久化,能保证多个服务实例、多次重启后的状态一致;CAS 只保障当前 JVM 内存中某个变量的原子更新,无法跨进程、跨机器,也不具备持久化能力。
换句话说:你不能用 AtomicInteger 替代订单库存的扣减,除非配合数据库最终落库;但可以用它高效管理线程池状态、计数器等纯内存场景。


















