Готовясь к предстоящему экзамену по параллельным системам, я пытаюсь ответить на несколько вопросов из учебника «Искусство многопроцессорного программирования». Меня беспокоит один вопрос:
Упражнение 129: Имеет ли смысл использовать один и тот же общий объект BackOff для push и pop в нашем объекте LockFreeStack? Как еще мы могли бы структурировать откат в пространстве и времени в 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();
}
}
}