compareAndSwapInt(var1, var2, var5, var5 + var4)
这个
var1:当前对象
var2:对象在内存中偏移量
var5:底层主内存中的值
var5 + var4 : 底层的值加上增长量
do {
var5 = this.getIntVolitale(var1, var2);
} while(!compareAndSwapInt(var1, var2, var5, var5 + var4))
首先当前线程通过 var1:当前对象加上 var2:偏移量地址,定位到底层主内存中对应的值,读取该值到工作内存中,将值赋给 var5,在执行while 语句的 CAS 操作时,通过 var1:当前对象加上 var2:偏移量地址重新读取主内存中的值和 var5 进行比较,
如果一样,说明在 do 语句执行完到开始执行 while 语句之间没有其他线程更新主内存的值,此时更新底层中对应的值。
不一样说明在 do 语句执行完到开始执行 while 语句之间主内存的值被其他线程更新过了。重新走循环的逻辑(即重新读取主内存中的最新值赋给 var5),也就是所谓的自旋
网友评论