最近在看多线程的有关知识,经常看到CAS这个名词,也查了很多的相关资料,下面简单说一下我对其的理解。
CAS英文名称:compare and swap 即比较并交换,从这就可以看出它的基本机制。
说起CAS就需要提到乐观锁和悲观锁,悲观锁:悲观的认为别人总是会修改共享数据,所以每次获取数据时就会加锁,乐观锁:乐观的认为别人不会修改数据,所以在获取数据时不是上锁,但是在更新数据时会检测数据是否冲突。
CAS就是乐观锁的一种实现方式,核心是冲突检测和数据更新。当多个线程尝试使用CAS同时更新同一个变量时,只有一个线程可以更新变量的值,其他的线程都会失败,失败的线程并不会挂起,而是告知这次竞争中失败了,并可以再次尝试。
CAS操作包括三个操作数:需要读写的内存位置(V)、预期原值(A)、新值(B)。如果内存位置与预期原值的A相匹配,那么将内存位置的值更新为新值B。如果内存位置与预期原值的值不匹配,那么处理器不会做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。总结就是CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。