CLH自旋锁

CLH自旋锁,ReentrantLock 锁的实现中重要一环

public class CLHLock implements Lock {  
    AtomicReference tail = new AtomicReference(new QNode());  
    ThreadLocal myPred;  
    ThreadLocal myNode;  
  
    public CLHLock() {  
        tail = new AtomicReference(new QNode());  
        myNode = new ThreadLocal() {  
            protected QNode initialValue() {  
                return new QNode();  
            }  
        };
        myPred = new ThreadLocal() {  
            protected QNode initialValue() {  
                return null;  
            }  
        };  
    }  
  
    @Override  
    public void lock() {  
        QNode qnode = myNode.get();  
        qnode.locked = true;
        QNode pred = tail.getAndSet(qnode);
        myPred.set(pred);
        while (pred.locked) {  
        }
    }
  
    @Override  
    public void unlock() {  
        QNode qnode = myNode.get();  
        qnode.locked = false;  
        myNode.set(myPred.get());  
    }  
}     

//tail
public final V getAndSet(V newValue) {
        while (true) {
            V x = get();
            if (compareAndSet(x, newValue))
                return x;
    }
}

从代码中可以看出lock方法中有一个while循环,这是在等待前趋结点的locked域变为false,这是一个自旋等待的过程。unlock方法很简单,只需要将自己的locked域设置为false即可。如此循环就实现了锁的过程。lock时myNode 放到 myPred里面,unlock时myPred放入myNode里面。

你可能感兴趣的:(CLH自旋锁)