首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不理解Java原子包中的CAS操作

不理解Java原子包中的CAS操作
EN

Stack Overflow用户
提问于 2015-01-07 01:48:00
回答 1查看 679关注 0票数 5

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

代码语言:javascript
复制
public class Counter{
    private AtomicInteger count = new AtomicInteger();
    public void increment(){
        count.getAndIncrement();    //atomic operation
    }
    ....
}

这是这本书对它的看法。

实际上,即使是像getAndIncrement()这样的方法也要执行几个步骤。这个实现现在是线程安全的原因是什么叫做CAS。CAS代表比较和交换。大多数现代CPU都有一组CAS指令。现在正在发生的事情的基本纲要如下:

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

好的,我明白多个步骤的意思了。我不太明白的是,在列举的步骤中发生了什么。

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

温度变量在哪里?它在主内存中吗,寄存器?或者这是特定于CPU体系结构的?

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

原始值存储在哪里?它不可能是临时变量。那个被修改了,对吧?我遗漏了什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-01-07 01:57:39

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27810235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档