public class ClhSpinLock { private final ThreadLocal pred; private final ThreadLocal node; private final AtomicReference tail = new AtomicReference(new Node()); public ClhSpinLock() { this.node = new ThreadLocal() { protected Node initialValue() { return new Node(); } }; this.pred = new ThreadLocal() { protected Node initialValue() { return null; } }; } public void lock() { final Node node = this.node.get(); node.locked = true; Node pred = this.tail.getAndSet(node); this.pred.set(pred); while (pred.locked) {} } public void unlock() { final Node node = this.node.get(); node.locked = false; this.node.set(this.pred.get()); } private static class Node { private volatile boolean locked; } }