CLH 锁

简介:

概述

CLH锁是一种自旋锁,能确保无饥饿性,提供先来先服务的公平性。所谓的自旋是指:当线程试图去拿已经被其它线程占有的锁时,当前线程不会进入阻塞态,而是进入一个死循环去自旋的获取锁,获取到锁之后退出死循环。
同时CLH锁也是一种基于链表的可扩展,高性能,公平的自旋锁,申请线程只在本地变量上自旋轮询前驱的状态,如果发现前驱释放了锁就结束自旋。

实验


public class CLHLock implements Lock {
    private final AtomicReference<QNode> tail;
    private final ThreadLocal<QNode> myPred;
    private final 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>();
    }
    
    private static class QNode {
        volatile boolean locked;
    }

    @Override
    public void lock() {
        QNode node = (QNode) myNode.get();
        node.locked = true;
        QNode pred = (QNode) tail.getAndSet(node);
        myPred.set(pred);
        while (pred.locked) {
        }
    }

    @Override
    public void unlock() {
        QNode node = (QNode) myNode.get();
        node.locked = false;
        myNode.set(null);
        myPred.set(null);
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public boolean tryLock() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Condition newCondition() {
        // TODO Auto-generated method stub
        return null;
    }
}
public class CLHLockTest {
    public static  int tmp = 0;
    public static CLHLock lock = new CLHLock();
    
    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();
            new Thread(new Run()).start();       
        }    
        System.out.println(CLHLockTest.tmp);
    }
}

class Run implements Runnable {

    @Override
    public void run() {        
        CLHLockTest.lock.lock();
        CLHLockTest.tmp++;
        CLHLockTest.lock.unlock();    
    }    
}

CLHLock使用tail 这个变量来标记队尾,当每个线程执行lock操作的时候,会生成相对应的myPred(指向前一个线程,以便监听前一个线程的执行情况,如果前一个线程myNode.locked = true, 这个线程会一直执行死循环来自旋;如果前一个线程myNode.locked = false; 这个线程就可以获取到锁了),myNode(用来给它的后继节点作为监听对象)的线程局部变量。当一个线程获取到锁后进行解锁时:它会获取自身的myNode,将其中的locked 标志位置为 false, 这样它的后继节点就可以从死循环中跳出来了(拿到锁了)。

如有错误希望大家能指出来
参考资料:
http://www.cnblogs.com/yuyutianxia/p/4296220.html
http://googi.iteye.com/blog/1736570

目录
相关文章
|
7月前
|
Java
java中的锁是一种同步机制,用于控制并发访问共享资源的线程。在多线程程序中,如果多个线程同时访问同一个共享资源,就可能会导致数据不一致或者死锁等问题。Java中提供了多种锁机制来解决这些问题,常见的包括synchronized关键字、ReentrantLock类、Read/Write Lock等。
37 0
|
6月前
|
Linux API C++
锁、避免死锁等相关
锁、避免死锁等相关
35 0
|
8月前
|
存储 算法 安全
辛辛苦苦的劳动成果,如何上把锁?
辛辛苦苦的劳动成果,如何上把锁?
|
9月前
|
数据可视化 Java
lock锁和死锁
lock锁和死锁
47 0
|
10月前
共享锁(读锁)和排他锁(写锁)
共享锁(读锁)和排他锁(写锁)
53 0
|
10月前
《锁》有那些?
锁是计算机科学中用于控制对共享资源的访问的一种同步机制。不同种类的锁适用于不同的场景和需求。下面是一些常见的锁的种类及其详细介绍:
49 1
|
12月前
|
SQL 监控 Oracle
【悲观锁/乐观锁/排它锁/共享锁/表级锁/行级锁/死锁】
【悲观锁/乐观锁/排它锁/共享锁/表级锁/行级锁/死锁】
|
12月前
|
存储 对象存储
|
PHP
并发锁(二):共享锁和独占锁
并发锁(二):共享锁和独占锁
181 0
并发锁(二):共享锁和独占锁
|
Java
各种锁的理解
各种锁的理解
96 0
各种锁的理解