> 文章列表 > 【JUC】CAS

【JUC】CAS

【JUC】CAS

【JUC】CAS

文章目录

  • 【JUC】CAS
    • 1. 概述
    • 2. Unsafe类

1. 概述

在Java并发编程中,CAS是一种非阻塞的算法,即Compare and Swap(比较并交换)。

CAS通过比较内存中某个位置的值和预期值,如果相同,则将该位置的值更新为新值;否则不进行任何操作。(和乐观锁的思想类似)

在多线程并发执行时,如果同时有多个线程尝试更新同一个位置的值,只有一个线程会成功,其他线程会失败,但它们并不会被阻塞,而是可以立即重新尝试(自旋)。

【JUC】CAS

示例代码:

public class CASDemo {public static void main(String[] args) {AtomicInteger atomicInteger = new AtomicInteger(5);System.out.println(atomicInteger.compareAndSet(5, 2022) + "\\t" + atomicInteger.get());System.out.println(atomicInteger.compareAndSet(5, 2023) + "\\t" + atomicInteger.get());atomicInteger.getAndIncrement();}
}

运行结果如下:

【JUC】CAS

CAS是JDK提供的非阻塞原子操作,它通过硬件保证了比较-更新的原子性。

它是非阻塞的且自身原子性,也就是说这玩意效率更高且通过硬件保证,说明这玩意更可靠。

CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题,Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。

执行cmpxchg指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行cas操作,也就是说CAS的原子性实际上是CPU实现的, 其实在这一点上还是有排他锁的,只是比起用synchronized, 这里的排他时间要短的多, 所以在多线程情况下性能会比较好


compareAndSet()方法的源代码:

【JUC】CAS

参数说明:

  • var1:表示要操作的对象
  • var2:表示要操作对象中属性地址的偏移量
  • var4:表示需要修改的数据的期望值
  • var5/var6:表示需要修改为的新值

【JUC】CAS


2. Unsafe类

待续。。