CAS
CAS(Compare-and-Swap)比较和交换,是一种实现线程安全的算法同时也是一个CPU指令,用来做哪些不能被打断的数据交换操作,是乐观锁、原子类和并发集合的底层原理
基本思路:记录要修改的原先值,在当前线程要修改时,对比之前的记录若被修改过了,就放弃本次修改,返回记录的原先值,避免多个线程进行修改时导致出错
CAS有如下缺点
- ABA问题:CAS只是检测是否与记录值相等,并不是检测是否被修改过,所以若被修改过的值和记录值相等,就有可能出现错误
- 自旋时间过长:若竞争非常激烈,导致锁一直获取不到,就会导致自旋白白消耗CPU
由于CAS需要利用到CPU的特殊指令(Java中会使用Unsafe
工具来直接操作内存,来实现硬件级别的原子操作),所以只能写出等价代码,具体如下
public class CAS {
private volatile int value; //模拟寄存器,需要多个线程可见所以加volatile
public synchronized int compareAndSwap(int expectedValue, int newValue) { //使用synchronized模拟成CPU一条指令
int oldValue = value; //记录原先值
if (oldValue == expectedValue) { //对比是否修改过
value = newValue; //没修改过就进行修改
}
return oldValue; //修改过就不修改,返回原先值
}
public static void main(String[] args) throws InterruptedException {
CAS cas = new CAS();
cas.value = 0;
Runnable runnable = () -> cas.compareAndSwap(0, 1);
Thread t1 = new Thread(runnable); //debug可以看出只有一个线程修改成功
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(cas.value);
}
}
Comments NOTHING