i++问题一个,
使用原子变量 AtomicInteger
CAS算法保证数据的原子性
CAS是硬件对于并发操作的支持
cas包括了,
内存值,V
期望值,A
更新值,B
当且仅当V==A时,才会把B的值赋给A,否则将不做什么操作
比较并交换
第一行结果为true 2019
第二行结果为false 2019
第一行:初始化为5,期望值也是5,所以可以修改为2019
这个时候已经为2019了
第二行:初始值为2019,期望值为5,所以就改不了1024,还是2019,
这就是cas,compare and set ,比较并交换
底层原理
cas缺点:循环时间长开销很大,源码里有do while循环,当比较不成功,会一直循环
只能保证一个变量的原子操作,当多个共享变量时,就需要加锁了
引出来的ABA问题:狸猫换太子
比如T1,需要工作10s,T2是2s
T1,T2读到A,而T1改成B,又改成了A,,这时候T1读到的还是A,而T2已经操作过,而T1不知道
这个过程虽然结果正确,但是问题很大
eg:
对象原子包装,AtomicReference原子引用,
解决方案
时间戳原子引用
变量带上版本号,T2修改后版本号会变更
AtomicStampReference
T1工作时连版本号也会比对,当版本号对不上,那么就不能T1修改了