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; } } }