4.1节7分54秒左右,讲解CAS方法时
1 | unsafe.compareAndSwapInt(var1, var2, var5, var5 + var4) |
解释`var2`是原来的值,var5是底层的值,最后一个形参是更换的值。实现原理是var2与var5进行比较,如果相同则硬件把值置为var5+var4。
但我查看调用:
1 2 3 | public final int incrementAndGet() { return unsafe.getAndAddInt( this , valueOffset, 1 ) + 1 ; } |
发现`var2`是valueOffset,即AtomicInteger中值的地址偏移量,这个值是不会变的。百度查阅资料后发现,正确的流程解释应该是:
`var2`是AtomicInteger的value的相对地址值,`var5`是期望值,`var5 + var4`是置换值,与compareAndSet类似,每次循环调本地方法时,传最新的预期值,和符合修改值。由本地方法中硬件层具体实现,如果预期值和最新值相同,将AtomicInteger对象的value值改为符合修改值