假设线程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也通过getIntVolatile(var1,var2)方法获取到value值3,此时刚好线程B没有被挂起并执行compareAndSwapInt方法比较内存值也是3,成功修改内存值为4,线程B打完收工,一切ok。
4.这时线程A恢复,执行compareAndSwapInt方法比较,发现自己手里的值数值3和主内存数值4不一致,说明该值已经被其他线程抢先一步修改了,那线程A本次修改失败,只能重新读取重新来一遍了。
5.线程A重新获取value值,因为变量value被volatile修饰,所以其他线程对它的修改,现成A总是能看到,线程A继续执行compareAndSwapInt进行比较替换,直到成功。