1、CAS(compare and swap)
理解总线锁和缓存锁后,对CAS就比较好理解了,这不是java特有的,而是操作系统需要保证的。cas指令在intel cpu上成为CMPXCHG指令,他的作用是将指定内存地址的值 与 所给的某个值相比,如果相等,则将其内容替换为指令中提供的新值,如果不相等,则更新失败。这个指令cmpxchg分为比较和替换两步,不是原子的,而保证其原子性的原理就是总线锁和缓存锁(缓存一致性协议)。
1.1、理解总线锁和缓存锁参考文档:
2、cpu中的CAS
2.1、汇编指令cmpxchg
作用:比较并交换操作数。
该指令只能用于486及其后继机型。其中cmpxchg分为比较和替换两步,不是原子的,所以用lock保证原子性。
3、java中的CAS
基于cpu的CAS实现的。也是自旋锁的实现方式之一。
在JUC中普遍应用。jdk1.6之后的synchronized也开始使用CAS。
使用 volatile 和 synchronized 锁都可以保证共享变量的可见性。相比 synchronized 而言,
volatile 可以看作是一个轻量级锁,所以使用 volatile 的成本更低,因为它不会引起线程上下文的切换和调度。
但 volatile 无法像 synchronized 一样保证操作的原子性。