CAS
什么是CAS
CAS:全称Compare and swap,字面意思:”比较并交换“,能够比较和交换某个寄存器中的值和内存中的值是否相等,如果相等,则把另一个寄存器中的值和内存进行交换。一个 CAS 涉及到以下操作:
我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。
- 比较 A 与 V 是否相等。(比较)
- 如果比较相等,将 B 写入 V。(交换)
- 返回操作是否成功。
CAS伪代码
下面写的代码不是原子的, 真实的 CAS 是一个原子的硬件指令完成的. 这个伪代码只是辅助理解CAS 的工作流程.
boolean CAS(address, expectValue, swapValue) {
if (&address == expectedValue) {
&address = swapValue;
return true;
}
return false;
}
由于CAS是通过一条指令完成的,这也就给我们实现线程安全除了加锁以外又多了一条方式——无锁编程。但CAS的使用范围是有局限性的,加锁适用性更广
CAS是怎么实现的
主要是通过CPU硬件支持,软件层面才做得到
CAS有哪些应用
实现原子类
比如,多线程针对一个count
变量进行++,在Java标准库中已经提供了一组原子类
标准库中提供了 java.util.concurrent.atomic
包, 里面的类都是基于这种方式来实现的。其中的AtomicInteger
和AtomicLong
最常用,提供了自增/自减/自增任意值/自减任意值的操作。这些操作就是基于CAS按照无锁编程的方式来实现
private static AtomicInteger count = new AtomicInteger(0);
public static void main