2. CAS底层原理
unsafe.getAndAddInt
假设线程A和线程B两个线程同时执行getAndAddInt操作 (分别跑在不同CPU上) :
1 AtomicInteger里面的value原始值为3, 即主内存中AtomicInteger的value为3, 根据JMM模型,线程A和线程B各自持有一
份值为3的value的副本分别到各自的工作内存。
2线程A通过getIntVolatile(var1, var2)拿到value值3, 这时线程A被挂起。
3线程B也通过getlntVolatile(var1, var2)方法获取到value值3, 此时刚好线程B没有被挂起并执行compareAndSwaplnt方法
比较内存值也为3,成功修改内存值为4,线程B打完收工,一切OK。
4这时线程A恢复,执行compareAndSwaplnt方法比较, 发现自己手里的值数字3和主内存的值数字4不- -致, 说明该值已
经被其它线程抢先一步修改过了,那A线程本次修改失败,只能重新读取重新来一-遍了。
5线程A重新获取value值, 因为变量value被volatile修饰, 所以其它线程对它的修改,线程A总是能够看到,线程A继续执
行compareAndSwapInt进行比较替换,直到成功。
简单版小总结
CAS ( CompareAndSwap)
比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,
否则继续比较直到主内存和工作内存中的值--致为止.
CAS应用
CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值B。
当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。