Java中的非阻塞CAS是否真的没有阻塞?

时间:2013-05-12 15:47:23

标签: java concurrency nonblocking compare-and-swap

我正在阅读一篇关于非阻塞CAS的文章,并且遇到了这段代码:

public class SimulatedCAS {
  private int value;

  public synchronized int getValue() {
    return value;
  }

  public synchronized int compareAndSwap(int expectedValue, int newValue) {
     int oldValue = value;
     if (value == expectedValue)
         value = newValue;
     return oldValue;
  }
}

如果使用同步,此CAS操作如何非阻塞?

如果我们的意思是SimulatedCAS的客户端不需要实现自己的同步,那么我们是不是只是移动了阻塞而不是消除它?

1 个答案:

答案 0 :(得分:3)

请注意,这是一个模拟 CAS(顾名思义);用Brian Goetz的话说(这个列表来自他的“Java Concurrency In Practice”一书)

  清单15.1中的

SimulatedCAS说明了CAS的语义(但不是实现或性能)。

CAS的实际实施需要CPU支持,来自java.util.concurrent.atomic包调用native方法的类。