CAS原理及其附带的问题
CAS(Compare-And-Swap)
是一种原子操作,用于实现多线程同步。在Java中,Atomic系列的类通过CAS实现了并发实现。
CAS操作包含三个参数:内存地址V、旧的预期值A、新的值B。当且仅当预期值A和内存地址V中的值相同时,才进行更新和替换。否则不执行任何操作。
CAS操作原理如下:
- 读取当前内存地址V的值;
- 对比内存地址V的值是否等于预期值A,如果不相等,则认为其他线程已经修改了该值;如果相等,则执行第三步操作;
- 将新值B写入到内存地址V中;
- 返回操作是否成功。
CAS操作保证了在多线程环境下,对内存的读取和写入是原子性的,避免了数据的冲突和同步问题。但是也存在ABA问题,即一个值从A变为B再回到A,在这个过程中,CAS无法检测到数据已经被修改过了,因此可以使用AtomicStampedReference解决。
AtomicStampedReference
- 原理使用
stamp
生成版本号 - 结合内存值比对、版本比对解决ABA问题
CAS带来三大问题
CAS(Compare and Swap)就是比较并交换,可以实现多线程环境下的无锁同步。其原理是在执行变量更新时,先比较当前内存中的值是否与预期值相同,若相同,则执行修改操作;否则终止修改操作。Android中,CAS常用来实现脏标记(Dirty Flag)模式、乐观锁以及Atomic类型等。CAS带来以下三大问题:
-
ABA问题
-
自旋时间过长
-
只能保证一个共享变量的原子操作