请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

老师您好!您在之前的视频中这么描述过:线程首先会尝试获取锁,如果失败,则会将当前线程以及等待等信息,包成一个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(),整个过程执行完毕。

正在回答 回答被采纳积分+3

1回答

Jimin 2018-04-27 11:18:18
你好,不是很明白你说的那个Thread1的问题。但是,获取锁失败的进程进入等待队列是没问题的。
0 回复 有任何疑惑可以回复我~
  • 提问者 Bill好想 #1
    就是对老师在视频中说的一句话,产生了疑惑:线程1调用lock()方法,线程就被加入到AQS等待队列里面去。因为你说的是调用lock后,加入AQS等待队列。而此时其实是成功获得锁的,是不是没加入AQS等待队列啊?不是只有失败的才加入等待队列吗?老师是不是口误说错了呀?
    回复 有任何疑惑可以回复我~ 2018-04-27 11:49:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信