CAS和ABA issus

时间:2016-03-14 09:25:38

标签: java multithreading thread-safety

我们知道类 java.util.concurrent.ConcurrentLinkedDeque 是CAS实现和

  1. 我想知道这个类是如何解决ABA问题的。
  2. 我已经看到了代码,但它太难以理解了。

    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; }

2 个答案:

答案 0 :(得分:2)

回答有关ABA问题的问题:

  

在垃圾收集语言中,这不是问题。为什么?因为   在观察之前,无法为新对象回收节点的内存   包含结构指针的线程已经释放它们。

(来自here

简而言之,当地址A处的引用首先指向一个对象,然后指向另一个对象时,会发生破坏性ABA情形,这可能发生在另一个线程首次释放地址保持A时,然后重新分配它保持对另一个对象的引用,而第一个线程卡住了。在Java中,这不可能发生,因为第一个线程始终拥有此引用,因此无法进行垃圾回收(释放)。它可以重新分配,但在那之后,第一个线程CAS将期望另一个(移动的)地址并失败。

如果两个时间A指向同一个对象,则第二个线程的A-> B-> A表示它不会修改任何内容,因此不会破坏一致状态(在这种情况下)。

答案 1 :(得分:1)

  

我想知道这个课程如何解决ABA问题。

代码就像单线程版本,除了;

  • p.item读取volatile字段。
  • Node的所有字段都是易变的。
  • 它使用CAS操作来执行写p.casItem(item, null)
  • 如果失败,
  • 和重试循环。

如果另一个线程正在修改数据结构,则CAS将失败,并且必须再次尝试。

CAS操作既是读写障碍,也是写入障碍。