Найти тему
DEBAGanov

Java 1095. Напишите минимальный неблокирующий стек (всего два метода — push() и pop()) с использованием Semaphore.

Неблокирующие структуры данных, такие как стек, обычно не используют семафоры для своей реализации, поскольку семафоры могут блокировать потоки, что противоречит идеологии неблокирующих алгоритмов. Однако я могу предложить вам реализацию неблокирующего стека без использования семафоров.

Вот пример минимальной реализации неблокирующего стека с методами push() и pop() на основе атомарных операций CAS (Compare-and-Swap):

import java.util.concurrent.atomic.AtomicReference;

public class NonBlockingStack<T> {
private static class Node<T> {
final T value;
Node<T> next;

Node(T value) {
this.value = value;
}
}

private final AtomicReference<Node<T>> top = new AtomicReference<>();

public void push(T value) {
Node<T> newNode = new Node<>(value);

do {
newNode.next = top.get();
} while (!top.compareAndSet(newNode.next, newNode));
}

public T pop() {
Node<T> oldTop;
Node<T> newTop;

do {
oldTop = top.get();
if (oldTop == null) {
return null; // Стек пуст }
newTop = oldTop.next;
} while (!top.compareAndSet(oldTop, newTop));

return oldTop.value;
}
}

В этой реализации используется класс AtomicReference, который обеспечивает атомарные операции чтения и записи ссылок. Каждый элемент стека представлен узлом Node, содержащим значение и ссылку на следующий узел.

Метод push() добавляет новый элемент на вершину стека. Он создает новый узел со значением и затем повторяет цикл CAS, чтобы попытаться обновить вершину стека на новый узел. Если операция CAS успешна, то новый узел успешно добавлен на вершину стека.

Метод pop() удаляет элемент с вершины стека. Он также использует цикл CAS для обновления вершины стека на следующий узел. Если операция CAS успешна, то возвращается значение удаленного узла.

Такая реализация обеспечивает неблокирующее выполнение операций push() и pop(), не приводя потоки в состояние блокировки или ожидания.

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov