compareAndSwapInt(var1, var2, var5, var5 + var4)这个
老师的解释是
var1:当前对象
var2:原来的值
var5:底层的值
var5 + var4 : 底层的值加上增长量
然后var2和var5比,一样就更新,不一样就不更新
然后很多同学,就整不明白了,比如下面:
do {
var5 = this.getIntVolitale(var1, var2);
} while(!compareAndSwapInt(var1, var2, var5, var5 + var4))
很多同学估计和我一样,一开始听视频,觉得有问题啊,既然var5是底层的值,
那么 var5 = this.getIntVolitale(var1, var2); 执行之后,
compareAndSwapInt(var1, var2, var5, var5 + var4)执行之前,
这个时候另外一个线程很可能己经跑过了,己经把底层值更新掉了。。
这个时候执行compareAndSwapInt(var1, var2, var5, var5 + var4))时候,不就有问题了
这个时候,var2和var5是一致的,然后我就更新,但其实var5是己经被更新掉了。这样不就有问题了吗?
------------------------------------
然后我调查了一下资料
var2:原来的值,这个解释不对(这个var2是个offset,是对象偏移量,学过汇编之类的,就知道了,类似于偏移地址,通过var1, var2可以取到底层中对应的值)
compareAndSwapInt(var1, var2, var5, var5 + var4))这句话我觉得这样说更好理解一点,
通过var1:当前对象加上var2:偏移量地址,定位到底层中对应的值,然后把这个值和var5进行比,
如果一样,就更新底层中对应的值,不一样说明己经被更新过了。重新走循环的逻辑,也就是所谓的自旋
----------------------------------------------------
var5 = this.getIntVolitale(var1, var2); 这个的意思应该是,var1:当前对象+var2:偏移量 ,可以取到底层中的实际值。
其实当前对象就是个地址,当前对象的地址加上偏移地址就能实际定位的某个具体的值了。
我的理解应该没啥问题吧?描述的可能不好。我觉得老师最好把视频修一下,不然估计很多同学都会有疑问