CAS(Compare and Swap)是一种无锁算法,在Java并发编程里广泛应用。它是一种原子操作,可在不使用锁的情况下对共享变量进行线程安全的更新。

基本原理

CAS操作需要三个参数:内存位置(V)、旧的预期值(A)和新值(B)。操作流程如下:

  1. 读取内存位置V的值。
  2. 把读取的值和旧的预期值A进行比较。
  3. 若两者相等,就将内存位置V的值更新为新值B;若不相等,则不做更新操作。
  4. 最后返回内存位置V的当前值。

作用

  • 避免锁的使用:与传统锁机制(如synchronized)相比,CAS操作能在无锁的情况下保证线程安全,从而减少了线程阻塞和上下文切换的开销,提高了并发性能。
  • 保证原子性:CAS操作是原子的,这意味着在多线程环境下,对共享变量的更新操作不会被其他线程干扰,保证了数据的一致性。

在并发编程中的应用

  • 原子类:Java的java.util.concurrent.atomic包提供了一系列原子类,像AtomicIntegerAtomicLong等。这些类利用CAS操作实现了原子性的自增、自减等操作,下面是一个简单示例:
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicExample {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(0);
        // 原子性地增加1
        atomicInteger.incrementAndGet();
        System.out.println(atomicInteger.get());
    }
}
  • 实现锁:一些锁的实现会借助CAS操作,例如ReentrantLock内部的AbstractQueuedSynchronizer(AQS)就使用了CAS操作来实现锁的获取和释放,避免了线程的阻塞和唤醒,提升了性能。
  • 并发容器:在并发容器(如ConcurrentHashMap)的实现中,CAS操作被用于更新容器的状态和数据,保证了在多线程环境下的高效并发访问。