高性能Java架构一书CAS算法代码讨论

img


上图,是书中的CAS算法代码,疑惑是在return语句,return value == expectedValue;

下图是测试代码和结果:

img


期待的旧值(expectedValue)传的是0,更新的值(newValue)传的是1。调试可以知道value被赋值为newValue了,这样的结果是返回true还是false?

应该如何理解这个代码?请大家伙帮帮忙,感谢!

对了,说一下,在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是否相等!