我正在研究Java书中的并发包。我不太明白这本书中有关CAS操作的一些内容。下面的代码示例是本书中一个线程安全的counter类。
public class Counter{
private AtomicInteger count = new AtomicInteger();
public void increment(){
count.getAndIncrement(); //atomic operation
}
....
}这是这本书对它的看法。
实际上,即使是像
getAndIncrement()这样的方法也要执行几个步骤。这个实现现在是线程安全的原因是什么叫做CAS。CAS代表比较和交换。大多数现代CPU都有一组CAS指令。现在正在发生的事情的基本纲要如下:
好的,我明白多个步骤的意思了。我不太明白的是,在列举的步骤中发生了什么。
温度变量在哪里?它在主内存中吗,寄存器?或者这是特定于CPU体系结构的?
原始值存储在哪里?它不可能是临时变量。那个被修改了,对吧?我遗漏了什么?
谢谢
发布于 2015-01-07 01:57:39
正在比较的值被加载到two+寄存器中(在您的示例中有三个)。然后,它可能使用像CMPXCHG8B这样的指令,它被描述为(部分)
将EDX:EAX与m64进行比较。如果相同,设置ZF并将ECX:EBX加载到m64中。否则,清除ZF并将m64加载到EDX:EAX中。
上面的第三个值可能位于不同的寄存器中,比如ECX (或EBX)或其他位置(只是不是EAX或EDX)。对于其他实现(不一定使用汇编程序),您可以参考比较与交换上的维基百科条目。
https://stackoverflow.com/questions/27810235
复制相似问题