CAS算法的理解与应用

CAS算法的理解与应用

什么是CAS

CAS:Compare and Swap,即比较再交换。
主要就是三个值的比较:内存值旧预期值新预期值
简单来说,就是线程1和线程2同时从内存中拿到了一个变量a=1(内存值)
此时两个线程各有一份拷贝的a的值,均为1(旧预期值)。
线程1把a改成了2,进行比较,发现内存值1=旧的预期值1,说明这个时间段没人改过,直接把修改写入内存。
线程2想把a改成3,比较发现,内存值2 != 旧的预期值1,说明这个时间段有人改过了a的值,这次修改失败
这就是CAS算法。
某些场景又叫做乐观锁,比如数据库中的version字段
乐观锁其实就是无锁,也没有死锁的概念,通过数据对比来控制版本一致性
但是不适用于高并发场景

CAS的开销

cas是cpu指令集的操作,是原子性的,速度很快,开销几乎没有

CAS的应用

AtomicInteger.incrementAndGet()

static AtomicInteger a = new AtomicInteger(0);
a.incrementAndGet();
System.out.println("结果:"+ a); // a=1,当然这个在多线程下使用更好

AtomicInteger.incrementAndGet的实现用了乐观锁技术,调用了类sun.misc.Unsafe库里面的 CAS算法,用CPU指令和cpu自旋来实现无锁自增。所以,AtomicInteger.incrementAndGet的自增比用synchronized的锁效率倍增。


版权声明:本文为qq_31363843原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。