一、定义
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) 方法
-
作用:将节点加入队列,如果队列为空则初始化队列。
-
源码:
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) 方法的执行流程:
1、调用 tryAcquire(int) 尝试获取同步状态。
2、如果成功,则直接返回。
3、如果失败,则调用 addWaiter(Node) 将当前线程封装为 Node 并加入等待队列。
4、调用 acquireQueued(Node, int) 在队列中自旋或阻塞,直到成功获取同步状态。
5、如果线程在等待过程中被中断,则调用 selfInterrupt() 重新设置中断标志。
四、总结