CLH自旋锁

作者: zhangxuanchen | 来源:发表于2017-03-13 17:08 被阅读87次

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

    public class CLHLock implements Lock {  
        AtomicReference<QNode> tail = new AtomicReference<QNode>(new QNode());  
        ThreadLocal<QNode> myPred;  
        ThreadLocal<QNode> myNode;  
      
        public CLHLock() {  
            tail = new AtomicReference<QNode>(new QNode());  
            myNode = new ThreadLocal<QNode>() {  
                protected QNode initialValue() {  
                    return new QNode();  
                }  
            };
            myPred = new ThreadLocal<QNode>() {  
                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自旋锁

        本文链接:https://www.haomeiwen.com/subject/loqqnttx.html