我正在寻找一个AtomicStampedReference和/或AtomicMarkableReference的例子,它可以帮助我理解这些类及其功能。 我无法通过网络获得任何质量示例。
我可以考虑在垃圾收集中使用它们,但是一个高质量的例子将帮助我更好地理解它们。
我正在寻找一个AtomicStampedReference和/或AtomicMarkableReference的例子,它可以帮助我理解这些类及其功能。 我无法通过网络获得任何质量示例。
我可以考虑在垃圾收集中使用它们,但是一个高质量的例子将帮助我更好地理解它们。
实际例子(复杂)
对于AtomicMarkableReference:
https://github.com/arunmoezhi/ConcurrentKaryST
对于AtomicStampedReference
https://github.com/arunmoezhi/LockFreeBST
简单的例子:
在二叉树中,如果要更改父节点的子节点 atomically
, 然后 compareAndSwap
在...上 AtomicMarkableReference
可以使用。
在二叉树中,假设您要以原子方式标记节点。然后 AtomicStampedReference
可以使用。
上述复杂的现实生活实现使用这两种类类型。
实际例子(复杂)
对于AtomicMarkableReference:
https://github.com/arunmoezhi/ConcurrentKaryST
对于AtomicStampedReference
https://github.com/arunmoezhi/LockFreeBST
简单的例子:
在二叉树中,如果要更改父节点的子节点 atomically
, 然后 compareAndSwap
在...上 AtomicMarkableReference
可以使用。
在二叉树中,假设您要以原子方式标记节点。然后 AtomicStampedReference
可以使用。
上述复杂的现实生活实现使用这两种类类型。
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问题。