class SemaphoreStack<T> {
private final Semaphore semaphore = new Semaphore(1);
private Node<T> head = null;
SemaphoreStack<T> push(T value) {
semaphore.acquireUninterruptibly();
try {
head = new Node<>(value, head);
} finally {
semaphore.release();
}
return this;
}
T pop() {
semaphore.acquireUninterruptibly();
try {
Node<T> current = head;
if (current != null) {
head = head.next;
return current.value;
}
return null;
} finally {
semaphore.release();
}
}
private static class Node<E> {
private final E value;
private final Node<E> next;
private Node(E value, Node<E> next) {
this.value = value;
this.next = next;
}
}
}