我们知道类 java.util.concurrent.ConcurrentLinkedDeque 是CAS实现和
我已经看到了代码,但它太难以理解了。
public boolean removeFirstOccurrence(Object o) {
checkNotNull(o);
for (Node p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null && o.equals(item) && p.casItem(item, null)) {
unlink(p);
return true;
}
}
return false;
}
答案 0 :(得分:2)
回答有关ABA问题的问题:
在垃圾收集语言中,这不是问题。为什么?因为 在观察之前,无法为新对象回收节点的内存 包含结构指针的线程已经释放它们。
(来自here)
简而言之,当地址A
处的引用首先指向一个对象,然后指向另一个对象时,会发生破坏性ABA情形,这可能发生在另一个线程首次释放地址保持A
时,然后重新分配它保持对另一个对象的引用,而第一个线程卡住了。在Java中,这不可能发生,因为第一个线程始终拥有此引用,因此无法进行垃圾回收(释放)。它可以重新分配,但在那之后,第一个线程CAS将期望另一个(移动的)地址并失败。
如果两个时间A
指向同一个对象,则第二个线程的A-> B-> A表示它不会修改任何内容,因此不会破坏一致状态(在这种情况下)。
答案 1 :(得分:1)
我想知道这个课程如何解决ABA问题。
代码就像单线程版本,除了;
volatile
字段。Node
的所有字段都是易变的。p.casItem(item, null)
如果另一个线程正在修改数据结构,则CAS将失败,并且必须再次尝试。
CAS操作既是读写障碍,也是写入障碍。