知识卡片
CAS是乐观提交
内容
CAS(Compare And Swap)把并发更新拆成”比较预期旧值、匹配则替换为新值”一步原子操作:操作系统层面是一条 CPU 原子指令(如 cmpxchg),Unsafe 的 compareAndSwapInt/Long 等方法直接封装它。默认冲突少所以不先加锁;比较发现内存值已变就返回失败,调用方决定是否重试。低竞争时比加锁轻,高竞争时大量重试会转化为新瓶颈,见 [[无锁也有边界]]。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第3章《CAS原理与JUC原子类》3.1.1节《Unsafe类中的CAS方法》(源文件:_epub-src/OEBPS/Text/chapter98.xhtml)
- 结论依据:原文说明操作系统层面的CAS是一条CPU原子指令(cmpxchg),Unsafe的CAS方法直接封装该指令,并给出“首先将内存位置的值与预期值(旧的值)比较,如果相匹配……更新为新值,并返回true;如果不匹配……返回false”的具体语义,因此推出CAS是乐观提交、失败可重试的结论。
- 原始内容:操作系统层面的CAS是一条CPU的原子指令(cmpxchg指令)……在执行Unsafe的CAS方法时,这些方法首先将内存位置的值与预期值(旧的值)比较,如果相匹配,那么CPU会自动将该内存位置的值更新为新值,并返回true;如果不匹配,CPU不做任何操作,并返回false。