Lock

作者: foxpeter | 来源:发表于2018-02-04 22:14 被阅读0次

以如下代码 通过修改thread的数量,观察lock的状态

首先new一个线程,单独占用lock

public class T {
    public static final ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        for(int i = 0; i < 1; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    lock.lock();
                    try {
                        System.out.println("lock");
                        try {
                            Thread.sleep(20000*1000L);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } finally {
                        lock.unlock();
                    }
                }
            }).start();
        }
    }
}

当lock.lock()执行完成后,state=1,因为只有一个线程,head和tail都为null,exclusiveOwnerThread为当前线程

image.png

下面我们将线程数调整到2,只修改上面代码中 i

for(int i = 0; i < 2; i++) {}
image.png

此时可以看出 AQS中的CLH队列 head 和 tail 都有了值,head是个空Node,只有next指针指向了tail,tail中是实际当前调用lock线程的包装Node

后续有线程调用lock时也将从tail中CAS加入

参考文档
http://blog.csdn.net/pfnie/article/details/53191892
https://www.cnblogs.com/waterystone/p/4920797.html
https://www.zybuluo.com/mikumikulch/note/268244
http://blog.csdn.net/chenchaofuck1/article/details/51592429
http://blog.csdn.net/prestigeding/article/details/53158246 condition

相关文章

网友评论

      本文标题:Lock

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