哪些 AtomicInteger 方法是 test-and-set、fetch-and-add 和 compare-and-swap(就无锁算法而言)?

Posted

技术标签:

【中文标题】哪些 AtomicInteger 方法是 test-and-set、fetch-and-add 和 compare-and-swap(就无锁算法而言)?【英文标题】:Which AtomicInteger methods are test-and-set, fetch-and-add and compare-and-swap (in terms of lock-free algorithms)? 【发布时间】:2019-09-07 09:39:36 【问题描述】:

CAS(比较和交换):boolean compareAndSet(int expect, int update)

FAA(获取并添加) : int addAndGet(int delta) ???

TAS (test-and-set) : ???

据我了解:

CAS (compare-and-swap) “同步”(无锁,在 CPU 指令级别)代码如下:

if(a==b) 
  a++;  // or a = a + 7;

FAA (fetch-and-add):“同步”(无锁,在 CPU 指令级别)代码如下:

x = x + 7;

但我不确定“测试和设置”与哪种代码相关。

【问题讨论】:

【参考方案1】:

Test-and-set 是一个原子 RMW 操作,它将内存位置的值设置为 1 并返回旧值(10)。

Java 中没有“真正的”测试和设置操作,但您可以通过将1 传递给AtomicInteger::getAndSet 并期望它返回10 来模拟它。或者,您可以通过将true 传递给AtomicBoolean::getAndSet 并期望truefalse 来模拟TAS。

在您提供的增加变量的示例中,它不是很有用,因为 TAS 是二进制操作。

【讨论】:

以上是关于哪些 AtomicInteger 方法是 test-and-set、fetch-and-add 和 compare-and-swap(就无锁算法而言)?的主要内容,如果未能解决你的问题,请参考以下文章

AtomicInteger关键字

AtomicInteger类中getAndIncrement方法中的spin是啥意思?

Java进阶-AtomicInteger

Java AtomicInteger类的使用方法详解_java - JAVA

Java中多线程,synchronized,与 AtomicInteger的问题

JAVA并发AtomicInteger源码注释