CAS:Compare AND Swap
jdk1.5之后出现的atomic类都依赖与CAS
CAS的三个核心参数
V: 主内存中存放,所有的线程共享
A:上次线程从主内存中拿到的V值,放到工作线程中,放到线程的栈帧中,每个线程私有
B:需要写入主内存并改写V的值,即最后的期望值
工作流程如下
主内存中保存V值,某个线程想要使用,首先从主内存中拿到该值并存放到工作内存中,为A,然后通过计算(比如+)得到结果B,然后在把B写回到主内存。
CAS的核心思想是在将B值写回到主内存之前,要比较V值和A值是否一样,如果不相同的话,说明此时V值已经被其他线程改变,需要重新将V值赋予A值,然后从新计算得到B,如果相同,则将B赋予V
CAS中的ABA问题
如果一开始取到A值,计算得到B,赋值之前取回V与A对比发现相等,此时并不等同与V值没有被其他线程操作过,有可能是被其他线程由A改为B,然后又改回了A,此时就是ABA问题
ABA问题一般不会影响线程操作的正确性
ABA解决办法
在变量前面添加版本号,每次操作都需要版本+1,ABA问题就变成了1A-2B-3A
atomic下的AtomicStampedReference类,他的compareAndSet方法就是先检查当前引用是否一样,然后检查当前标识,全部相等,再给V赋予新值
atomic相关类
AtomicInteger
AtomicLong
AtomicBoolean
AtomicReference(对其他类型进行封装,如果封装的是Inreger那么实际上就是AtomicInteger)
new AtomicReference<Integer>()
网友评论