【JAVA】46. AQS抽象队列同步器源码深度解析

一、核心知识点详细解释

1.1 AQS 概述

AQS(AbstractQueuedSynchronizer)是 Java 并发包 java.util.concurrent 中的一个抽象类,它是构建锁和其他同步组件的基础框架。许多并发工具如 ReentrantLockCountDownLatchSemaphore 等都是基于 AQS 实现的。AQS 提供了一个 FIFO(先进先出)的队列来管理线程,通过一个 int 类型的状态变量 state 来表示同步状态,线程可以通过修改这个状态变量来获取或释放锁。

1.2 AQS 的核心数据结构

1.2.1 同步状态 state

state 是 AQS 中的一个 volatile 修饰的 int 类型变量,用于表示同步状态。不同的同步组件可以根据 state 的值来实现不同的同步逻辑。例如,在 ReentrantLock 中,state 表示锁的重入次数,当 state 为 0 时表示锁未被持有,大于 0 时表示锁已被持有且重入了相应的次数。

1.2.2 队列

AQS 内部维护了一个 FIFO 的双向队列,用于管理等待获取锁的线程。队列中的每个节点(Node)代表一个等待的线程,节点包含了线程的引用、等待状态等信息。

1.3 AQS 的核心方法

1.3.1 acquire(int arg)

该方法用于获取锁,是一个模板方法,其实现如下:

public final void acquire(int arg) {
   
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}
  • tryAcquire(arg):尝试获取锁,这是一个需要子类实现的方法,用于自定义获取锁的逻辑。
  • addWaiter(Node.EXCLUSIVE):将当前线程封装成一个节点并加入到等待队列的尾部。
  • acquireQueued(node, arg):使节点在队列中等待获取锁,如果在等待过程中被中断,则返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VinfolHu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值