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