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