福州网站改版,网站优化是什么意思,有一个网站叫浪什么,wordpress style.Java之AQS#xff08;AbstractQueuedSynchronizer#xff09;
AQS 介绍
AQS 的全称为 AbstractQueuedSynchronizer #xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 ● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实…Java之AQSAbstractQueuedSynchronizer
AQS 介绍
AQS 的全称为 AbstractQueuedSynchronizer 翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 ● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现 ● 是重量级基础框架及整个JUC体系的基石主要用于解决锁分配给”谁“的问题。 ● 整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作并通过一个int类变量表示持有锁的状态
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {
}
AQS 为构建锁和同步器提供了一些通用功能的实现因此使用 AQS 能简单且高效地构造出应用广泛的大量的同步器比如我们提到的 ReentrantLockSemaphore其他的诸如 ReentrantReadWriteLockSynchronousQueue等等皆是基于 AQS 的 AQS为什么是JUC内容中最重要的基石
和AQS有关的 ReentrantLock CountDownLatch ● 进一步理解锁和同步器的关系 ○ 锁面向锁的使用者定义了程序员和锁交互的使用层API隐藏了实现细节你调用即可 ○ 同步器面向锁的实现者Java并发大神DoungLee提出了统一规范并简化了锁的实现将其抽象出来屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等是一切锁和同步组件实现的----公共基础部分
AQS 核心思想
AQS 核心思想是如果被请求的共享资源空闲则将当前请求资源的线程设置为有效的工作线程并且将共享资源设置为锁定状态。如果被请求的共享资源被占用那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制这个机制 AQS 是基于 CLH 锁变体 Craig, Landin, and Hagersten locks 实现的。
CLH 锁是对自旋锁的一种改进是一个虚拟的双向队列虚拟的双向队列即不存在队列实例仅存在结点之间的关联关系暂时获取不到锁的线程将被加入到该队列中。AQS 将每条请求共享资源的线程封装成一个 CLH 队列锁的一个结点Node来实现锁的分配。在 CLH 队列锁中一个节点表示一个线程它保存着线程的引用thread、 当前节点在队列中的状态waitStatus、前驱节点prev、后继节点next。
CLH 队列结构如下图所示 AQS(AbstractQueuedSynchronizer)的核心原理图 AQS内部体系架构----AQS自身 AQS的int类型变量state AQS的同步状态State成员变量 另外状态信息 state 可以通过 protected 类型的getState()、setState()和compareAndSetState() 进行操作。并且这几个方法都是 final 修饰的在子类中无法被重写。
//返回同步状态的当前值
protected final int getState() {return state;
}// 设置同步状态的值
protected final void setState(int newState) {state newState;
}
//原子地CAS操作将同步状态值设置为给定值update如果当前同步状态的值等于expect期望值
protected final boolean compareAndSetState(int expect, int update) {return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
------
著作权归JavaGuide(javaguide.cn)所有
基于MIT协议
原文链接https://javaguide.cn/java/concurrent/aqs.html著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接https://javaguide.cn/java/concurrent/aqs.html AQS的CLH队列 CLH三个大牛的名字组成队列为一个双向队列 AQS内部体系架构----内部类Node Node的int变量 Node的等待状态waitState成员变量 说人话 等候区其他顾客其他线程的等待状态队列中每个排队的个体就是一个Node Node此类的讲解 内部结构 以Reentrantlock的实现来分析AQS的原理及应用
由于篇幅过长放在下一篇文章中