【JUC】CAS
文章目录
- 【JUC】CAS
- 1. 概述
- 2. Unsafe类
1. 概述
在Java并发编程中,CAS是一种非阻塞的算法,即Compare and Swap(比较并交换)。
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();}
}
运行结果如下:
CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性。
它是非阻塞的且自身原子性,也就是说这玩意效率更高且通过硬件保证,说明这玩意更可靠。
CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题,Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。
执行cmpxchg指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行cas操作,也就是说CAS的原子性实际上是CPU实现的, 其实在这一点上还是有排他锁的,只是比起用synchronized, 这里的排他时间要短的多, 所以在多线程情况下性能会比较好
compareAndSet()方法的源代码:
参数说明:
- var1:表示要操作的对象
- var2:表示要操作对象中属性地址的偏移量
- var4:表示需要修改的数据的期望值
- var5/var6:表示需要修改为的新值
2. Unsafe类
待续。。