阅读时间: 5分钟
CAS是原子操作的一种,可用于在多执行绪编程中实现不被打断的数据交换操作,从而避免多执行绪同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。
该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。
CAS是由CPU硬体实现,所以执行相当快。
CAS有3个操作数:
内存值M (记忆体地址)现时的预期值A将要修改的新值B当且仅当预期值A和内存值M相同时,就会自动地将内存值M修改为B,否则什麽都不做保持现状。
CAS的关键点在于,系统在硬件层面保证了比较并交换(CAS)操作的原子性,
处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。
当我们返回M值时,其实它已经经历了3个步骤包括获得数值、比较数值、更新数值。
而这3个步骤被视作一个machine level的操作。
从而保证了它的原子性。
另外,当有多个Thread尝试存取更新同一个值时,CAS只容许一个Thread有修改的权限。
而其他Thread就会被即时通知它们的行动失败,叫它们回家。
例子:
public final long getAndIncrement() { while (true) { long current = get(); long next = current - 1; //当-1操作成功的时候直接返回,退出此迴圈 if (compareAndSet(current, next)) return current; } } //呼叫JNI实现CAS public final boolean compareAndSet(long expect, long update) { return unsafe.compareAndSwapLong(this, valueOffset, expect, update); }
参考文章/网站/书本:
Atomic Operations
Java的Atomic分析
AtomicLong.java