CAS 是Compare and Swap的缩写,即我们所说的比较与交换。
CAS是一种基于锁的操作,且是乐观锁。
在java中锁分为【乐观锁】和【悲观锁】。
【乐观锁】:采取的是一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加版本号(version)来获取数据,性能比较【悲观锁】有很大的提升。
【悲观锁】:是将资源锁住,等之前获得锁的线程释放锁之后,下一个线程才可以访问。
CAS操作包含三个操作数,内存位置(V)、预期原值(A)和新值(B)。如果内存地址里面的值和预期原值的值时一样的,那么就将内存里面的值更新成新值。CAS是通过无限循环来获取数据的,如果在第一轮循环中,a线程获取地址里面的值,被b线程修改了,那么a线程需要自旋,到下次循环才有可能会执行。
java.util.concurrent.atomic包下的类,大多数使用CAS操作来实现的。【AtomicInteger、AtomicBoolean、AtomicLong】