繁体   English   中英

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

[英]Don't understand CAS operations in Java atomic package

我正在研究Java书中的并发包。 我不太明白这本书关于CAS操作的内容。 以下代码示例是本书中的线程安全counter类。

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

这是本书所说的内容。

实际上,即使像getAndIncrement()这样的方法仍然需要执行几个步骤。 这个实现现在是线程安全的原因是CAS。 CAS代表Compare And Swap。 大多数现代CPU都有一组CAS指令。 现在发生的事情的基本概要如下:

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

好吧,我得到了关于多个步骤的说法。 我没有得到的是列举的步骤中发生的事情。

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

那个临时变量在哪里? 它是在主存中,注册吗? 或者这是针对CPU架构的?

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

原始值存储在哪里? 它不能是临时变量。 那个人正在修改,对吗? 我错过了什么?

谢谢

被比较的值被加载到两个+寄存器中(在您的示例中为三个)。 然后它可能使用像CMPXCHG8B这样的指令(部分地描述为)

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

上面的第三个值可能在不同的寄存器中,如ECX (或EBX )或其他某个位置(只是不是EAXEDX )。 对于其他实现(不一定使用汇编程序),您可以参考比较和交换的Wikipedia条目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM