AQS的acquire(int arg) 方法底层源码
一、定义
acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态。如果当前线程无法获取同步状态,则将其加入等待队列并阻塞,直到成功获取同步状态或被中断
1、acquire(int arg) 方法的作用
-
功能:尝试获取同步状态(独占模式),如果失败则将当前线程加入等待队列并阻塞,直到成功获取同步状态或被中断
-
返回值:无返回值,但可能会抛出 InterruptedException
二、acquire(int arg) 方法的源码
以下是 acquire(int arg) 方法的源码及其详细解析:

1、tryAcquire(int arg) 方法
-
作用:尝试获取同步状态,由子类实现。
-
返回值:如果成功获取同步状态,则返回 true;否则返回 false。

2、addWaiter(Node mode) 方法
-
作用:将当前线程封装为 Node 并加入等待队列。
-
参数:mode:节点模式,Node.EXCLUSIVE 表示独占模式,Node.SHARED 表示共享模式

3、enq(Node node) 方法
-
作用:如果队列为空则初始化队列,然后通过for循环将节点加入队列。
-
源码:

4、acquireQueued(Node node, int arg) 方法
-
作用:在队列中自旋或阻塞,直到成功获取同步状态。
-
返回值:如果线程在等待过程中被中断,则返回 true;否则返回 false。

5、shouldParkAfterFailedAcquire(Node pred, Node node) 方法
-
作用:检查是否需要阻塞当前线程,若当前线程为首节点的线程不对该线程进行阻塞,否则进行阻塞。
-
返回值:如果需要阻塞,则返回 true;否则返回 false。
-
源码:

6、parkAndCheckInterrupt() 方法
-
作用:阻塞当前线程并检查是否被中断。
-
返回值:如果线程被中断,则返回 true;否则返回 false。
-
源码:

7、selfInterrupt() 方法
-
作用:如果线程在等待过程中被中断,则重新设置中断标志。
-
源码:

三、acquire(int arg)方法的执行流程
acquire(int arg) 方法的执行流程:
1、调用 tryAcquire(int) 尝试获取同步状态。
2、如果成功,则直接返回。
3、如果失败,则调用 addWaiter(Node) 将当前线程封装为 Node 并加入等待队列。
4、调用 acquireQueued(Node, int) 在队列中自旋或阻塞,直到成功获取同步状态。
5、如果线程在等待过程中被中断,则调用 selfInterrupt() 重新设置中断标志。
四、总结


浙公网安备 33010602011771号