1. CAS原理介绍
CAS是什么:是一种常见的降低读写锁冲突,保证数据一致性的乐观锁机制。
在上一篇文章中提到,volatile主要是解决共享变量可见性的一种机制,但是确无法解决读—改—写的原子操作。
而本文介绍的CAS是原子操作的一种。可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。
该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。CAS
算法CAS(V, E, N)
包含3
个参数,
V
表示要更新的变量,
E
表示预期的值,
N
表示新值。
在且仅在V
值等于E
值时,才会将V
值设为 N
,如果V
值和 E
值不同,则说明已经有其他线程做了更新,当前线程什么都不做。最后,CAS
返回当前V的真实值。Concurrent
包下所有类底层都是依靠CAS
操作来实现,JDK里面的Unsafe类提供了一系列的 compareAndSwap* 方法,而sun.misc.Unsafe
为我们提供了一系列的CAS
操作。
2. CAS会遇到的问题
-
ABA
问题 -
自旋问题