CAS
CAS(Compare And Swap)比较并交换
CAS是多线程环境下对共享变量进行修改时的一种策略,主要存在三个参数:当前值、预估值、结果
CAS采用的策略是当一个线程要对共享变量进行修改时,需要获取内存中共享变量的值作为预期值,并将预期值和结果交给CPU,CPU会将预期值和内存中共享变量的当前值进行判断,如果两者相等,就说明这个过程中没有其他线程修改了共享变量,然后就可以对共享变量进行修改;如果两者不相等,那么CAS就会再次获取共享变量的当前值作为预期值,再次交给CPU进行判断,就这样一直循环,知道循环达到一定的次数或者两者比较相等而结束。
CAS操作是一种乐观锁的实现方式,也就是不加锁,可以使得线程响应速度变快,但同时如果存在很多CAS操作一直循环的情况,就会占用很多资源。
ABA问题
指的是一个线程获取到的期望值即使和共享变量的值相等,但是此时的期望值却不是最新的值。
存在两个线程A和B都获取共享变量的值作为期望值,此时线程B先进行CAS操作,将共享变量从A改为B,线程B再一次进行CAS操作,将共享变量从B改为A,此时线程A使用期望值和共享变量进行判断,虽然是相等的,但是线程A此时的期望值已经不是共享变量的最新值,线程A并不知道,其在获取期望值到进行比较的过程中共享变量发生了几次变化,虽然操作的结果是正确的,但是并不知道迭代了几个版本,于是就出现了ABA问题。
ABA问题解决
通过版本号判断是否发生了修改,每次CAS操作成功时都会增加版本号,在进行比较阶段除了比较期望值,还要比较版本号,通过比较版本号能发现版本有没有出现更新的情况,从而解决ABA问题。