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方法,最后导致代码阻塞到了下面这个地方
接下来我们在控制台输入一个1 字符串,使主线程调用unlock方法来释放锁,跟踪代码
然后会调用tryRelease方法
接下来我们看下unparkSuccessor 方法
这样我们的子线程,就被唤醒了,接下来子线程执行,会从上次阻塞的地方开始执行
执行到此,我们的图变成这样了
由于Node没有人在引用,后面就被回收了,实际上我们的Node2继承了Node1,变成了Node1。到此我们的主线程的锁就释放完成了。
继续看子线程的unlock
到此子线程释放锁完成。
今天就讲到这里吧,分析不清楚的敬请谅解。可以加我qq一起讨论。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400 表演视频实例https://v.qq.com/x/page/f0517awx0x4.html