首先来一幅AQS整体数据结构源码
AQS中有很多重要的成员变量其中包括上面图中的Head,Tail。它们永远保存当前被阻塞住的线程按照顺序依次排列下去
上面Node中的成员变量Thread就是存放阻塞的线程变量
有了上面大概的信息我们开始进入源码分析,
1.AQS是如何让线程阻塞的了?
上面acquier方法中tryAcquire是一个抽象方法。AQS采用模板方法设计模式让其子类实现。
addWaiter是将当前的运行的线程封装Node节点对象,并插入到等待队列中
acquireQueued则是判断当前添加的