调用lock方法不管是否成功获得锁与否都会被放进AQS等待队列吗

来源:6-6 J.U.C之AQS-ReentrantLock与锁-2

Bill好想

2018-04-27

老师您好!您在之前的视频中这么描述过:线程首先会尝试获取锁,如果失败,则会将当前线程以及等待等信息,包成一个Node节点加入到AQS的同步等待队列中去。而在7-6视频中,您说Thread1调用lock方法时,此时是成功获得了锁的,也会加入AQS等待队列中去。

那么,我的疑问来了,请问这里是不是有矛盾啊?难道不是获取锁失败的线程,才需要加入AQS的等待队列吗?


附上您视频中的大致讲解过程:

线程1调用lock()方法,线程就被加入到AQS等待队列里面去(拿到锁)。

线程1调用condition.await()方法,则线程被移到condition队列中去。(此时已经从AQS等待队列中移除了,释放锁)

此时线程2获得锁,调用lock,线程2加入AQS等待队列(拿到锁)。

线程2调用condition.signalAll(),condition的线程1节点被取出重新放回AQS等待队列中去,但此时线程1仍未被唤醒。

线程2调用unlock()方法,释放锁,AQS按照从头到尾的顺序,唤醒线程1。

线程1调用unlock(),整个过程执行完毕。

写回答

1回答

Jimin

2018-04-27

你好,不是很明白你说的那个Thread1的问题。但是,获取锁失败的进程进入等待队列是没问题的。
0
1
Bill好想
就是对老师在视频中说的一句话,产生了疑惑:线程1调用lock()方法,线程就被加入到AQS等待队列里面去。因为你说的是调用lock后,加入AQS等待队列。而此时其实是成功获得锁的,是不是没加入AQS等待队列啊?不是只有失败的才加入等待队列吗?老师是不是口误说错了呀?
2018-04-27
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程