欢迎访问宙启技术站
智能推送

Java并发之CAS原理详解

发布时间:2023-05-17 08:20:44

CAS,即“比较和交换”(Compare and Swap),是一种高效而又线程安全的并发控制机制。它的原理是:在一个共享变量被多个线程访问时,先比较该变量的值是否与预期值相同,若相同则将该变量的值设为新值;否则重新尝试读取该变量的值并再次进行比较和交换操作,直到成功为止。CAS 并发控制实际上就是利用了多线程环境下的竞争条件,实现了 “先检查后执行”的操作,这样就避免了多线程同时修改共享变量时出现的冲突问题。

CAS 的实现依赖于硬件的支持,即 CPU 指令集中的 CMPXCHG 指令。该指令可以原子地比较并交换一个内存位置的值,实现了 CAS 的操作。在 Java 中,CAS 操作是由 Sun Microsystems 通过 JNI 调用 C++ 实现的。

Java 中 CAS 的原理可以简单总结为三个步骤:

1.读取共享变量的值;

2.比较共享变量的值与预期值是否相同;

3.相同则将共享变量的值设为新值,否则重试步骤 1 和 2。

具体实现过程可以如下所示:

public final int compareAndSwapInt(Object var1, long var2, int var4, int var5) {
    // 获取内存地址 var2 处存储的整数值
    int v = unsafe.getIntVolatile(var1, var2);
    // 如果该值与 var4 相等,则将其设置为 var5,并返回 true
    // 如果不相等,则返回 false
    return unsafe.compareAndSwapInt(var1, var2, var4, var5) ? 1 : 0;
}

可以看出,CAS 操作一般返回一个布尔值。如果操作成功,则返回 true;否则返回 false。在 Java 中,很多并发框架如 AtomicInteger、AtomicReference、ConcurrentHashMap 等都使用了 CAS 操作。

CAS 的优点在于其高并发性和线程安全性,可以有效避免竞态条件。但是 CAS 还是存在一些缺点,例如在高并发场景下,若线程自旋的次数过多,会占用大量的 CPU 资源,进而降低系统的整体性能;同时,由于 CAS 的操作都是基于相对较低层次的硬件指令实现的,所以代码可读性较差,调试和维护难度较大。

综上所述,CAS 是一种高效而又线程安全的并发控制机制。在 Java 中,它被广泛应用于 atomic 类的实现和并发容器的实现,能够有效降低竞态条件的风险,提升系统的整体性能。