CAS其实就是乐观锁的一种实现方式,其优点就是不需要加锁就能进行原子操作,而悲观锁比较典型的就是Java中的synchronized
CAS全称compare and swap——比较并替换
它是并发条件下修改数据的一种机制,包含三个操作数:
需要修改的数据的内存地址(V);
对这个数据的旧预期值(A);
需要将它修改为的值(B);
CAS的操作步骤如下:
1.修改前记录数据的内存地址V;
2.读取数据的当前的值,记录为A;
3.修改数据的值变为B;
4.查看地址V下的值是否仍然为A,若为A,则用B替换它;若地址V下的值不为A,表示在自己修改的过程中,其他的线程对数据进行了修改,则不更新变量的值,而是重新从步骤2开始执行,这被称为自旋;
通过以上四个步骤对内存中的数据进行修改,就可以保证数据修改的原子性。
Java并不能像C或C++一样,直接操作内存,但是JVM为我们提供了一个后门,就是sun.misc.Unsafe类,这个类为我们实现了很多硬件级别的原子方法,当然,这些方法都是native方法,使用其他语言实现,而不是Java方法。
unsafe.compareAndSwapInt(this, valueOffset, expect, update)