我们知道,AQS中最重要的两个方法就是acquire和release方法。我们本文来走读走读acquire的源码。
首先,tryAcquire是需要子类具体去实现,其作用就是设置state的值,如果设置成功,就代表获取资源,否则会进入下面的流程,也就是将当前线程封装到阻塞队列。
下面先来分析addWaiter方法。我们进入addWaiter方法看看。
1、首先,创建一个Node节点,我们知道这个Node节点是AQS的一个内部类。也是AQS阻塞队列(注:AQS阻塞队列是基于双向链表实现的)的基本类型,你可以想象成链表的Node节点。
2、由于AQS插入的顺序是在尾节点tail插入元素,取元素是在head节点进行。AQS初始化的时候,head和tail都指向null。因此这里Node pred首先指向尾节点。如果尾节点不为空则将当前创建的node节点前驱节点设置为pred。然后调用compareAndSetTail这个CAS操作将当前创建的node设置为tail节点,如果设置成功则将之前尾节点的pred后驱节点指向node。这里也就是说将新创建的node设置为新的tail节点,同时设置链表的指针。