欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AQS详解 2

程序员文章站 2022-05-04 20:14:18
...

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方法,最后导致代码阻塞到了下面这个地方
AQS详解 2
接下来我们在控制台输入一个1 字符串,使主线程调用unlock方法来释放锁,跟踪代码
AQS详解 2
然后会调用tryRelease方法
AQS详解 2
AQS详解 2
接下来我们看下unparkSuccessor 方法

AQS详解 2
这样我们的子线程,就被唤醒了,接下来子线程执行,会从上次阻塞的地方开始执行
AQS详解 2

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

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

相关标签: java源码解析