下图是测试代码和结果:
应该如何理解这个代码?请大家伙帮帮忙,感谢!
对了,说一下,在CSDN提这个问题之前,我有和书的作者讨论过这个问题,但是我们都各执己见,所以我现在在找第三者一起讨论看看!
你的问题少了一个现在的值value,
如果现在的值value是0时,和期望旧值相同,那么就把value变成更新的值newValue为1。返回false
如果现在的值value不是0时,和期望旧值不相同,那么就不能更新value的值,value是1时,返回true。否则返回false。
我来写一下回答,这是我参考的资料。还有一个参考资料在评论回答那里!
我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《java并发编程-CAS算法》, 一起来围观吧 https://blog.csdn.net/wwwzhouzy/article/details/119714483?utm_source=app&app_version=5.4.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
关键代码我抽取出来!
package com.zhouzy.base.juc;
public class CasTest {
public static void main(String[] args) {
CompareAndSwap cas = new CompareAndSwap();
for(int i=0;i<10;i++) {
new Thread(new Runnable() {
@Override
public void run() {
int expectValue = cas.get();
boolean b = cas.compareAndSet(expectValue, (int)(Math.random() * 101));
System.out.println("本次更新是否成功:"+b);
}
}).start();
}
}
}
class CompareAndSwap {
private int value;
//获取内存值
public synchronized int get() {
return value;
}
//比较
public synchronized int compareAndSwap(int expectValue,int newValue) {
int oldValue = value;
if(oldValue == expectValue) {
this.value = newValue;
}
return oldValue;
}
//设置
public synchronized boolean compareAndSet(int expectValue,int newValue) {
return expectValue == compareAndSwap(expectValue, newValue);
}
}
解析,书中的代码set返回值含义弄不清楚这是一点。
书中代码的set方法是return value == expectedValue,而这个value有可能是oldValue也有可能是newValue。
参考资料的代码中,return的是oldValue,返回上一个方法再判断oldValue与expectValue是否相等!