浅谈并发:CAS & AQS
前言
这篇文章躺在草稿里 6 个月了,最近才发现 2333,于是翻出来补全了下。
CAS
**CAS(Compare-and-Swap 比较和替换)**故名思意就是先比较然后替换的操作方式,是原子操作中的一种,同时也是无锁操作中的一种。在 Java 中广泛使用,常见的如 AQS 的更新状态、CopyOnWriteArrayList
。
通常情况下,我们操作某个共享资源,为了防止其他进程的干扰,我们通常会给这个共享资源加上一把锁,然而加锁,释放锁,竞争锁,线程的阻塞和唤醒是非常耗能的操作。而 CAS 采用的是记录内存位置和原始值,当记录的原始值与当前内存位置的值(当前值)相同的时候,就将新值更新到内存。如果不同说明在这过程中有其他线程干扰,执行失败策略。由于是无锁的操作,所以便没有了加锁和释放锁间一系列的额外开销,所以非常快。
流程
在进行 CAS 操作前需要三个操作参数:
- 内存位置 V(它的值是我们想要去更新的)
- 预期原值 A(上一次从内存中读取的值)
- 新值 B(应该写入的新值)
操作过程:
先从 V 中取值,与 A 比较,如果相等则将 V 中的值更新成 B,如果不相等,说明 V 上的值被修改过了,也就是其他线程干扰了,这时候就不更新,进入失败的操作流程,比如重试,报错等。