Cas & volatile

1. Cas & volatile

What is cas;

好脾气

什么是 CAS(乐观锁)?

CAS (Compare-And-Swap) 是一种乐观锁 (Optimistic Locking) 的核心思想。

  • 工作模式: “我很乐观,我假设我操作数据时,没有其他线程在捣乱。我先干活,干完最后检查一下。”

  • 实现方式: CAS 是一种原子的 CPU 指令。你不能用 Java 代码来实现它,你只能调用它(Java 中通过 sun.misc.Unsafe 类或 java.util.concurrent.atomic 包来调用)。

CAS 指令包含三个操作数:

执行逻辑(重点): 当 CPU 执行 CAS(address, Old, New) 指令时,它会原子性地完成以下检查:

“请检查内存地址 V 处的值,是否等于我预期的旧值 A?

  • 如果是: 太好了,说明在我准备的期间没有别人改过它。请把它更新为新值 B。并返回 true(成功)。

  • 如果不是: 糟糕,说明在我准备的期间,有别的线程把它改掉了。我什么也不做。并返回 false(失败)。”

“原子性”是这里的关键:“检查是否为A”“更新为B” 这两个步骤是在 CPU 层面被捆绑在一起的,中间不允许任何其他线程插队

有锁无锁对比
特性 synchronized (悲观有锁) CAS (乐观无锁)
核心思想 悲观:假设有冲突,先加锁。 乐观:假设无冲突,先尝试,失败再重试。
实现机制 依赖 JVM 和操作系统的互斥锁 依赖 CPU 的原子指令 CAS。
线程状态 获取锁失败的线程会被阻塞(Block),进入休眠,出让CPU。 尝试CAS失败的线程不会被阻塞,而是自旋(Spin),即空转CPU,不断重试。
"有锁效果" 通过“加锁-解锁”保证同一时间只有一个线程能进入代码块。 通过CAS原子指令保证同一时间只有一个线程能成功更新内存值。

cas与volatile的关系

image1

为什么无锁比有锁快

image2

cas特点

image3

1.优点

2.缺点及其优化