先说一下我的理解与疑问吧,我对AQS的理解是这是一个抽象队列式的同步器框架。AQS框架内部维护了一个共享的state变量,过对这个状态的修改来达到同步的目的。具体对状态如何修改,要看继承AQS的具体子类如何实现比如Reentrantlock,CountDownLatch。因为涉及到对共享变量修改,由之前学的可见性知识我猜测这个state变量是volatile的,查了下还真是。然后AQS框架自己做的工作是维护一个线程队列,控制请求资源线程的阻塞与唤醒。
老师讲AQS有一个CLH队列,这个CLH队列我理解是保存的是请求获取资源的线程队列,如果CLH队列的线程请求资源失败,会对线程信息进行封装,封装成一个Node节点,添加进同步队列。老师说“接着会不断的循环尝试获取锁,条件是当前节点为head的直接后继才会尝试。如果失败就会阻塞自己直到自己被唤醒。而当持有锁的线程释放锁的时候,会唤醒队列中的后继线程。“这儿是CLH队列的直接后继不断尝试获取锁,然后失败阻塞自己封装成Node节点加入同步队列嘛?如果是这样为什么不直接将阻塞的线程直接放在CLH队列的末尾呢?这一块不明白希望老师解答一下。