CAS(Compare and Swap比较并交换)是一种比较特殊的并发策略,它包含三个参数:原内存值、预期值、新的值。当线程进行操作时先对比原内存值与预期值是否相同,若不同则表明数据发生过变动,当前线程放弃本次数据操作,但是允许再次尝试。当多个线程同时操作时能够保证只有一个线程操作成功,其他线程重新操作或放弃而不会被挂起。整个过程不涉及锁竞争及线程调度带来的开销,性能更优并且天生对死锁免疫。
java.util.concurrent.atomic包中大量使用了这种并发策略,这里以AtomicInteger(jdk1.7)简单说明CAS的使用。
类中定义的value保存了对应的整数值:
private volatile int value;
以下是加法运算,程序对比this与expect值是否相等,相等则继续操作,否则证明值被其他线程修改过需要重新取值对比。
CAS相比于其他形式的锁效率较高但是也有一些缺点:其中之一称之为ABA问题,比如数据初始值为0,线程A操作该数据期间,线程B将数据修改为1,线程C又将数据修改为0,这时线程A对数据的操作可以正常执行,也就是说线程A并不知道期间有其他线程操作过数据,这在有些场合是不允许发生的,需要添加一些类似版本号信息之类的变量可以防止此类问题发生。