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() 重新设置中断标志。


四、总结

posted @ 2025-02-28 01:24  jock_javaEE  阅读(68)  评论(0)    收藏  举报