这里实现就是用了隐式的队列,每个线程完成释放锁后,自旋的线程可以知道是不是该自己拿锁
public class CLHLock {
final ThreadLocal<Node> node = ThreadLocal.withInitial(Node::new);
final AtomicReference<Node> tail = new AtomicReference<>(new Node());
static class Node{
volatile boolean locked;
}
public void lock(){
final Node currentNode = this.node.get();
currentNode.locked = true;
Node prev = this.tail.getAndSet(currentNode);
while(prev.locked){}
}
public void unlock(){
final Node currentNode = this.node.get();
currentNode.locked = false;
this.node.set(new Node());
}
}