CAS和自旋到底是一个概念吗?

CAS是 compare and swap ,就是一个比较工作内存和主内存的值是否相同,相同的话,就用新值来替换这么一个操作。

但是,为什么好多地方都说这是自旋呢?

我理解比较一次的话,成功就返回true了,失败,那么就返回false。如果没有for循环的话,这就是一次操作啊,它本身不会去重试吧?只有在for(;;)死循环里边,才可以重试啊,很多底层都是这样做的。

所以,仅仅是CAS的话,就是一次操作,为什么叫做自旋呢。自旋的概念到底就是说是CAS,还是说有for循环的才叫CAS。真的很误导人啊。

下面贴一下 CAS的源码注释:

image.png

这里边,没有任何词语说,它本身有自动重试这个机制吧?

阅读 12.3k
2 个回答

你的理解大体上是没问题的,稍微还有一点不完美。

自旋和cas不是一回事儿,只是再cas的时候可以利用自旋机制来不断重试

自旋是一种锁优化机制,所以锁优化中会有『自旋锁』的概念(线程空转重试获取锁),自旋不一定是用在cas场景,其他锁场景也是能用的(比如互斥锁)

cas是一种乐观锁机制,cas可以不用自旋机制,失败也可以直接返回false。只是一般应用场景下,cas都会带有重试机制(while和for实现空转,不断尝试)

是两个概念,你的理解没错,只不过经常将cas和轮询结合使用,实现线程安全的,不使用锁的读写操作。
举个例子:

void lock() {
  bool exp = false;
  while (lock_.compare_exchange_weak(exp, true) == false) {
    exp = false;
  }
}

lock_是一个原子变量,compare_exchange_weak是c++的cas实现方式之一,这里就结合了cas和while轮询做线程安全的自旋锁。

推荐问题