一、什么是CAS?
1、比较并交换
AtomicInteger
compareAndSet 如果期望值(主内存的值)与修改值(工作内存的值)相同,则修改;
类似GitHub的提交版本号。
2、CAS的底层原理是什么?
它是一条并发原语。
比较当前工作内存和主内存的值,如果相同则执行规定操作,否则继续直到主内存和工作内存的值一致为止。
CAS应用
CAS中有三个操作数,内存值V,期望值A,要修改的值B。
当且仅当V等于A时,才会将内存中的V替换为B,否则什么都不做。
3、CAS缺点
①getAndAddInt方法执行的时候,有个dowhile方法,
如果CAS失败,会一直尝试,如果CAS 长时间不成功,会给CPU带来很大的开销。
②他只能保证一个共享变量的原子操作。
③ABA问题
产生
CAS实现需要取出内存的数据比较并替换,在这个时间差内会导致数据变化。
如何解决?
原子引用 AtomicReference<?>
时间戳原子引用 AtomicStampedReference - 新增机制,修改版本号(时间戳)
T1 100 1
T2 100 1 101 2 100 3
结果如下: