CAS(Compare and Swap)是一种无锁算法,在Java并发编程里广泛应用。它是一种原子操作,可在不使用锁的情况下对共享变量进行线程安全的更新。
基本原理
CAS操作需要三个参数:内存位置(V)、旧的预期值(A)和新值(B)。操作流程如下:
- 读取内存位置V的值。
- 把读取的值和旧的预期值A进行比较。
- 若两者相等,就将内存位置V的值更新为新值B;若不相等,则不做更新操作。
- 最后返回内存位置V的当前值。
作用
- 避免锁的使用:与传统锁机制(如
synchronized
)相比,CAS操作能在无锁的情况下保证线程安全,从而减少了线程阻塞和上下文切换的开销,提高了并发性能。 - 保证原子性:CAS操作是原子的,这意味着在多线程环境下,对共享变量的更新操作不会被其他线程干扰,保证了数据的一致性。
在并发编程中的应用
- 原子类:Java的
java.util.concurrent.atomic
包提供了一系列原子类,像AtomicInteger
、AtomicLong
等。这些类利用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操作被用于更新容器的状态和数据,保证了在多线程环境下的高效并发访问。