// AtomicInteger 内部就是 CAS
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // CAS 实现,无锁// CAS 伪代码(实际是 CPU 指令 cmpxchg)booleancompareAndSwap(int[] arr, int i, int expected, int newVal) {
if (arr[i] == expected) { // 比较
arr[i] = newVal; // 交换returntrue;
}
returnfalse; // 失败,调用方重试
}
// 数据库乐观锁:加 version 字段// UPDATE SET stock=stock-1, version=version+1// WHERE id=? AND version=?(读时的version)int n = dao.update("...WHERE id=? AND version=?", id, oldVer);
if (n == 0) thrownewConcurrentModifyException(); // 被别人改了
ABA 问题:值 5→6→5,CAS 认为没变(还是5),但中间其实变过。解决:加版本号(AtomicStampedReference)。例:转账 A→B→A,看起来没变,但钱动过。