不了解Java原子包中的CAS操作

dri*_*ood 5 java atomicity compare-and-swap

我正在研究Java书籍中的并发包。我不太了解本书中有关CAS操作的内容。下面的代码示例是counter本书中的线程安全类。

public class Counter{
    private AtomicInteger count = new AtomicInteger();
    public void increment(){
        count.getAndIncrement();    //atomic operation
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

这是书中所说的。

实际上,即使诸如这样的方法也要getAndIncrement()花费几个步骤来执行。此实现现在是线程安全的,因此称为CAS。CAS代表“比较并交换”。大多数现代CPU都有一组CAS指令。现在正在发生的事情的基本概述如下:

  1. 存储在count中的值将被复制到一个临时变量中。
  2. 临时变量增加。
  3. 将当前计数的值与原始值进行比较。如果未更改,则将旧值替换为新值。

好吧,我明白它关于多个步骤的说法。我不太了解的是枚举步骤中正在发生的事情。

  1. 存储在count中的值将被复制到一个临时变量中。

该临时变量在哪里?它在主存储器中,注册吗?还是特定于CPU体系结构?

  1. 将当前计数的值与原始值进行比较。如果未更改,则将旧值替换为新值。

原始值存储在哪里?不能是临时变量。那个人正在被修改,对吧?我想念什么?

谢谢

Ell*_*sch 0

正在比较的值被加载到两个以上的寄存器中(在您的示例中为三个)。CMPXCHG8B然后它可能会使用类似(部分)描述为的指令

将 EDX:EAX 与 m64 进行比较。如果相等,则设置 ZF 并将 ECX:EBX 加载到 m64 中。否则,清除 ZF 并将 m64 加载到 EDX:EAX 中。

上面的第三个值可能位于不同的寄存器中,例如ECX(或EBX) 或其他位置(只是不是EAXEDX)。您可以参考有关比较和交换的维基百科条目以了解其他实现(不一定使用汇编器)。