在为即将到来的并发系统考试做准备的过程中,我试图从教科书"多处理器编程的艺术"中完成一些问题.一个问题是困扰我:
练习129:在我们的LockFreeStack对象中使用相同的共享BackOff对象进行推送和弹出是否有意义?我们怎样才能在EliminationBackOffStack中构建空间和时间的退避?
这个问题让我感到困惑,因为我想到的第一件事就是它没有意义,因为所有退避对象都会让进程等待,所以为什么不分享呢?问题的第二部分完全没有我,任何帮助都是最受欢迎的.
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)