AQS详解 2

1.今天我们来讲下释放锁
继续接着(AQS详解1)我们分析,首先回顾下客户端代码

 public static void main(String[] args) throws InterruptedException {
        // final ReentrantLock lock = new ReentrantLock();
        final MutexLock lock = new MutexLock();
        lock.lock(); 
        new Thread() {
            public void run() {
                lock.lock();
                System.err.println("==============");
                lock.unlock();
            };
        }.start();
        Scanner sc = new Scanner(System.in);
        System.out.print("Please enter a string : ");
        String lein = sc.next();
        if (lein.equals("1")) {
            lock.unlock();
        }
    }

我们分析到了线程调用了lock方法,最后导致代码阻塞到了下面这个地方
在这里插入图片描述
接下来我们在控制台输入一个1 字符串,使主线程调用unlock方法来释放锁,跟踪代码
在这里插入图片描述
然后会调用tryRelease方法
在这里插入图片描述
在这里插入图片描述
接下来我们看下unparkSuccessor 方法

在这里插入图片描述
这样我们的子线程,就被唤醒了,接下来子线程执行,会从上次阻塞的地方开始执行
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
执行到此,我们的图变成这样了
在这里插入图片描述
由于Node没有人在引用,后面就被回收了,实际上我们的Node2继承了Node1,变成了Node1。到此我们的主线程的锁就释放完成了。
继续看子线程的unlock
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到此子线程释放锁完成。

今天就讲到这里吧,分析不清楚的敬请谅解。可以加我qq一起讨论。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400 表演视频实例https://v.qq.com/x/page/f0517awx0x4.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值