为了备考我的并发系统考试,我正在尝试完成《多处理器编程艺术》这本教材中的一些问题。其中有一个问题让我很困扰:
练习 129:在我们的 LockFreeStack 对象中,是否使用相同的共享 BackOff 对象用于 push 和 pop 是有意义的?我们如何在 EliminationBackOffStack 中在空间和时间上构建 backoff?
这个问题让我觉得不可行,因为 backoff 对象所做的只是让进程等待,那么为什么不能分享它呢?问题的第二部分完全使我困惑,希望能得到任何帮助。
LockFreeStack 的代码:
练习 129:在我们的 LockFreeStack 对象中,是否使用相同的共享 BackOff 对象用于 push 和 pop 是有意义的?我们如何在 EliminationBackOffStack 中在空间和时间上构建 backoff?
这个问题让我觉得不可行,因为 backoff 对象所做的只是让进程等待,那么为什么不能分享它呢?问题的第二部分完全使我困惑,希望能得到任何帮助。
LockFreeStack 的代码:
public class LockFreeStack<T> {
AtomicReference<Node> top = new AtomicReference<Node>(null);
static final int MIN_DELAY = ...;
static final int MAX_DELAY = ...;
Backoff backoff = new Backoff(MIN_DELAY, MAX_DELAY);
protected boolean tryPush(Node node) {
Node oldTop = top.get();
node.next = oldTop;
return(top.compareAndSet(oldTop, node));
}
public void push(T value) {
Node node = new Node(value);
while (true) {
if (tryPush(node)) {
return;
} else {
backoff.backoff();
}
}
}