4. 什么是CAS?

189 阅读2分钟

"CAS" 通常指的是 "Compare and Swap",它是一种多线程同步原语,用于实现无锁并发算法。CAS 操作允许你比较某个内存位置的值与期望的值是否相等,如果相等,则将该位置的值更新为新的值;如果不相等,则不做任何操作。

在Java中,CAS 操作通常是通过 java.util.concurrent.atomic 包中的类来实现的,比如 AtomicIntegerAtomicLong 等。这些类提供了一些方法,如 compareAndSet,用于执行 CAS 操作。CAS 操作在多线程编程中被广泛用于实现一些低级别的同步机制,以避免使用锁和阻塞。

使用 CAS 可以避免锁的竞争和开销,从而提高并发性能。然而,需要注意的是,CAS 并不是适合所有情况,因为它在高并发、频繁竞争的情况下可能会导致自旋等待,从而浪费CPU资源。在选择使用 CAS 还是锁时,需要根据具体情况进行权衡和选择。

以下是一个简单的示例,展示了如何在Java中使用 AtomicInteger 进行 CAS 操作:

import java.util.concurrent.atomic.AtomicInteger;

public class CASExample {
    public static void main(String[] args) {
        AtomicInteger value = new AtomicInteger(0);

        int expectedValue = 0;
        int newValue = 1;
        boolean updated = value.compareAndSet(expectedValue, newValue);

        if (updated) {
            System.out.println("CAS operation successful");
        } else {
            System.out.println("CAS operation failed");
        }
    }
}

在上述示例中,如果当前 value 的值等于 expectedValue,则会将其更新为 newValue,并返回 true,表示操作成功。如果不相等,则返回 false,表示操作失败。

总结:

1、CAS(compare and swap)的缩写,中⽂翻译成⽐较并交换。
2、CAS 不通过JVM,直接利⽤java本地⽅ JNI(Java Native Interface为JAVA本地调⽤),直接调⽤CPU 的cmpxchg(是 汇编指令)指令。
3、利⽤CPU的CAS指令,同时借助JNI来完成Java的⾮阻塞算法,实现原⼦操作。其它原⼦操作都是利⽤类似的特性完成 的。
4、整个java.util.concurrent都是建⽴在CAS之上的,因此对于synchronized阻塞算法,J.U.C在性能上有了很⼤的提升。
5、CAS是项乐观锁技术,当多个线程尝试使⽤CAS同时更新同⼀个变量时,只有其中⼀个线程能更新变量的值,⽽其它 线程都失败,失败的线程并不会被挂起,⽽是被告知这次竞争中失败,并可以再次尝试。

1、使⽤CAS在线程冲突严重时,会⼤幅降低程序性能;CAS只适合于线程冲突较少的情况使⽤。 <br/>
2、synchronized在jdk1.6之后,已经改进优化。synchronized的底层实现主要依靠Lock-Free的队列,基本思路是⾃旋后阻塞,竞 争切换后继续竞争锁,稍微牺牲了公平性,但获得了⾼吞吐量。在线程冲突较少的情况下,可以获得和CAS类似的性能;⽽线 程冲突严重的情况下,性能远⾼于CAS