Java 面试题
目录

Java 中 CAS 的原理是什么?

· 约 3 分钟读完 · 第 67 / 274 章

推荐答案

CAS(Compare-And-Swap)是一种用于实现多线程同步的原子操作。它通过比较内存中的值与预期值是否相等来决定是否更新内存中的值。如果相等,则更新为新值;否则,不进行任何操作。CAS 操作是原子的,意味着它在执行过程中不会被其他线程打断。

在 Java 中,CAS 操作通常通过 java.util.concurrent.atomic 包中的类来实现,如 AtomicInteger、AtomicLong 等。这些类提供了 compareAndSet 方法,用于执行 CAS 操作。

本题详细解读

CAS 的基本原理

CAS 操作涉及三个操作数:

  1. 内存位置(V):需要更新的变量的内存地址。
  2. 预期值(A):期望内存中的当前值。
  3. 新值(B):如果内存中的值与预期值相等,则将内存中的值更新为新值。

CAS 操作的伪代码如下:

CAS 的原子性

CAS 操作的原子性是通过硬件指令(如 cmpxchg 指令)来实现的。这些指令确保在执行 CAS 操作时,不会被其他线程打断,从而避免了竞态条件。

CAS 在 Java 中的应用

在 Java 中,java.util.concurrent.atomic 包提供了多个原子类,如 AtomicInteger、AtomicLong 等。这些类内部使用了 CAS 操作来实现线程安全的更新操作。

例如,AtomicInteger 类的 compareAndSet 方法实现如下:

其中,unsafe.compareAndSwapInt 是一个本地方法,底层通过硬件指令实现 CAS 操作。

CAS 的优缺点

优点:

  • 无锁操作:CAS 操作不需要使用锁,因此不会导致线程阻塞,适合高并发场景。
  • 高性能:由于避免了锁的开销,CAS 操作通常比锁机制更高效。

缺点:

  • ABA 问题:CAS 操作可能会遇到 ABA 问题,即内存中的值从 A 变为 B 又变回 A,CAS 操作仍然会成功。可以通过引入版本号或时间戳来解决。
  • 自旋开销:如果 CAS 操作失败,线程可能会不断重试,导致 CPU 资源浪费。

总结

CAS 是一种高效的并发控制机制,适用于多线程环境下的原子操作。Java 通过 java.util.concurrent.atomic 包提供了对 CAS 的支持,开发者可以利用这些类来实现线程安全的操作。