使用AtomicStampedReference&的使用案例原子标记参考

时间:2013-12-17 06:31:19

标签: java java.util.concurrent

我正在寻找AtomicStampedReference& /或AtomicMarkableReference的示例,它可以帮助我理解这些类及其功能。 我无法在网上获得任何高质量的例子。

我可以考虑在垃圾收集中使用它们,但是一个高质量的例子可以帮助我更好地理解它们。

3 个答案:

答案 0 :(得分:11)

实际例子(复杂)

对于AtomicMarkableReference:

https://github.com/arunmoezhi/ConcurrentKaryST

AtomicStampedReference

https://github.com/arunmoezhi/LockFreeBST

简单示例:

在二叉树中,如果要更改父节点atomically的子节点,则可以使用compareAndSwap上的AtomicMarkableReference

在二叉树中,假设您要以原子方式标记节点。然后可以使用AtomicStampedReference

上述复杂的现实生活实现使用这两种类类型。

答案 1 :(得分:0)

AtomicMarkableReferenceAtomicStampedReference用于求解ABA problem

在多线程计算中,同步期间发生 ABA问题 ,当位置被读取两次,两次读取具有相同的值且“值相同”时用于表示“没有任何变化”。但是,另一个线程可以在两次读取之间执行并更改值,执行其他工作,然后再将值更改回,因此,即使第二个线程的工作违反了该假设,也使第一个线程认为“什么都没有改变”。 / p>

Initially: x = 0
Thread1: read x // sees x = 0
Thread2: x = 1
Thread3: x = 0
Thread1: read x // again sees x = 0, thinking that nothing has changed

为解决上述问题,我们可以维护一个戳记,当线程更改某些状态时,该戳记应进行更新(递增):

Initially: x = 0, stamp = 0
Thread1: read stamp // sees stamp = 0
Thread2: x = 1, stamp = 1
Thread3: x = 0, stamp = 2
Thread1: read stamp,x // sees stamp = 2 which is != 0 hence do some processing

答案 2 :(得分:-2)

S Kr这是一个解释。拿一个看起来像这样的堆栈。顶部 - > A - > B - > C.
采取两个线程,Th1和Th2。他们使用非阻塞比较和设置(CAS)进行弹出操作 Th1:设置return = A,next = B ..但是被移出运行状态
Th2:
  - pop A:return = A,next = B,CAS(A,B)..所以现在top = B
  - pop B:return = B,next = C,CAS(B,C)..所以现在top = C
  - 推A(与先前满足的= =相同的oblect,因为我们说它被缓存在某处):..所以现在top是A,堆栈看起来像这样.. top - > A - > ç
Th1:回到行动..并恢复.. CAS(A,B)..这成功!! Stack现在看起来像这样.. top - > B - > C ..但是......但是...... B已经被线程2从堆栈中删除了,它神奇地回来了!坏。
故事的道德:使用AtomicStampedReference。 AtomicMarkableReference是AtomicStampedReference的一个特例
奖励:想想一个有序的链表,以及多个线程。尝试在A中插入C - > B - > D - > E,并找出类似的ABA问题。