问题 使用AtomicStampedReference和AtomicMarkableReference的用法


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

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


12507
2017-12-17 06:31


起源



答案:


实际例子(复杂)

对于AtomicMarkableReference:

https://github.com/arunmoezhi/ConcurrentKaryST

对于AtomicStampedReference

https://github.com/arunmoezhi/LockFreeBST

简单的例子:

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

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

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


10
2018-02-26 04:03



不敢相信这个问题和答案得到的票数很少...... - Alex Salauyou
@arunmoezhi为什么通常的AtomicReference在binaru树的例子中是不够的? - gstackoverflow


答案:


实际例子(复杂)

对于AtomicMarkableReference:

https://github.com/arunmoezhi/ConcurrentKaryST

对于AtomicStampedReference

https://github.com/arunmoezhi/LockFreeBST

简单的例子:

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

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

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


10
2018-02-26 04:03



不敢相信这个问题和答案得到的票数很少...... - Alex Salauyou
@arunmoezhi为什么通常的AtomicReference在binaru树的例子中是不够的? - gstackoverflow


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 = =,因为我们说它在某处缓存了):..所以现在顶部是A,堆栈看起来像这样..顶部 - > A - > C
Th1:回到行动..并恢复.. CAS(A,B)..这成功!!堆栈现在看起来像这样..顶部 - > B - > C ..但是......但是...... B已经被线程2从堆栈中删除了,它神奇地回来了!坏。
故事的道德:使用AtomicStampedReference。 AtomicMarkableReference是AtomicStampedReference的一个特例。

奖励:想想一个有序的链表,以及多个线程。尝试在A - > B - > D - > E中插入C,并找出类似的ABA问题。


-1
2017-09-09 17:03