1、CAS(compare and swap)

理解总线锁和缓存锁后,对CAS就比较好理解了,这不是java特有的,而是操作系统需要保证的。cas指令在intel cpu上成为CMPXCHG指令,他的作用是将指定内存地址的值 与 所给的某个值相比,如果相等,则将其内容替换为指令中提供的新值,如果不相等,则更新失败。这个指令cmpxchg分为比较和替换两步,不是原子的,而保证其原子性的原理就是总线锁和缓存锁(缓存一致性协议)。

1.1、理解总线锁和缓存锁参考文档:

cpu高速缓存出现原因

解决cpu高速缓存技术潜在问题:缓存一致性问题

lock指令底层是总线锁还是缓存锁

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 一样保证操作的原子性。

posted on 2022-03-14 15:15  哑吧  阅读(180)  评论(0编辑  收藏  举报