首页 > 其他分享 >AQS详解

AQS详解

时间:2023-08-04 17:37:34浏览次数:36  
标签:AQS 队列 共享资源 int state 详解 线程

1、AQS介绍

AQS的全称是AbstractQueuedSynchronizer,抽象队列同步器。这个类在java.util.concurrent.locks包下面。

AQS就是一个抽象类,主要用来构建锁和同步器。

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer
implements java.io.Serializable {
}

AQS为构建锁和同步器提供了一些通用功能的实现,因此,使用AQS能简单且高效地构建出应用广泛的大量的同步器,比如:ReentrantLock,Semaphore,其他的如:ReentrantReadWriteLock、SynchronousQueue等皆是基于AQS的。

2、AQS原理

AQS核心思想是:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是基于CLH锁实现的。

CLH锁是对自旋锁的一种改进,是一个虚拟的双向队列加粗样式(虚拟的双向队列即不存在队列实例,仅存在结点的关联关系),暂时获取不到锁的线程将被加入到该队列中。AQS将每条请求共享资源的线程封装成一个CLH队列锁的一个结点(Node)来实现锁的分配。在CLH队列锁种,一个节点表示一个线程,它保存着线程的引用(thread)、当前节点在队列中的状态(waitStatus)、前驱节点(pre)、后继节点(next)。

CHL队列锁结构如下图所示:

AQS详解_AQS

AQS(AbstractQueuedSynchronizer)的核心原理图:

AQS详解_AQS_02

AQS使用int成员变量state表示同步状态,通过内置的线程等待队列来完成获取资源线程的排队工作。

state变量由volatile修饰,用于展示当前临界资源的获锁情况。

// 共享变量,使用volatile修饰保证线程可见性
private volatile int 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);
}

以ReentrantLock为例,state初始值为0,表示值为0,表示未锁定状态。A线程lock()时,会调用tryAcquire()独占该锁并将state+1。此后,其他线程再tryAcquire()时就会失败,直到A线程unlock()到state=0(即释放锁)为止,其他线程才有机会获取该锁。

当然,释放锁之前,A线程自己是可以重复获取此锁的(state会累加),这就是可重入的概念。但要注意,获取多少次就要释放多少次,这样才能保证state是能回到零态的。

再以CountDownLatch为例,任务分为N个子线程去执行,state也初始化为N(注意N要与线程个数一致)。这N个子线程是并行执行的,每个子线程执行完成后countDown()一次,state会CAS(compare and swap)减1。等到所有子线程都执行完后(即state=0),会unpark()主调用线程,然后主调用线程就会从await()函数返回,继续后续动作。

标签:AQS,队列,共享资源,int,state,详解,线程
From: https://blog.51cto.com/u_11315052/6964989

相关文章

  • Linux抓包工具tcpdump详解
    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要......
  • 亚德客-DPS系列电子式数显压力传感器-说明书详解
     一、说明书     二、模式详解 简易模式:只要气压大于设定值则为ON(接通),小于设定值则为OFF(断开)迟滞模式:H:高限位值L:低限位值气压在大于高限位H时为ON(接通),小于低限位L时为OFF(断开)窗型模式:H:高限位值L:低限位值气压在大于高限位H或者低于低限位L时为......
  • Android Dex文件详解
    前言==相信大家都熟悉dex文件,把一个apk给解压缩,就会得到一堆dex文件,但是这些dex文件是怎么来的,又有什么用,为什么这样设计,有进行思考过吗俗话说知其然,知其所以然,本篇文章开始探究一下这些底层实现细节。正文==不同的虚拟机JVMJVM是JavaVirtualMachine的简称,即Java虚拟机,它本质是......
  • Windows运行命令之netstat命令详解
    一、简介netstat命令显示处于活动状态的TCP连接、计算机正在侦听的端口、以太网统计信息、IP路由表、用于IP、ICMP、TCP和UDP协议的IPv4统计信息和IPv6统计信息(IPv6、ICMPv6、TCPoverIPv6和UDPoverIPv6协议)。使用没有参数的情况下,此命令显示活动TCP连接。 二、命令示例1、nets......
  • awk命令详解
    awk变量1、主要作用用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组2、格式2.1awk[选项]'匹配规则和处理规则'[处理文本路径][root@localhost~]#awk-F:'{print$1}'/etc/passwd匹配规则主要是:正则表达式处理规则主要是:设置变量......
  • Xcode Snippets 功能详解
    http://nshipster.com/xcode-snippets/iOSdevelopmentallbutrequirestheuseofXcode.Toitscredit,Xcodehasimprovedprettyconsistentlyoverthelastcoupleofyears.Sure, itstillhasits…quirks,buthey—thingscouldbe much,muchworse.Workingi......
  • React Hooks 中的属性详解
    ReactHooks是React16.8版本中新增的特性,允许我们在不编写class的情况下使用state和其他的React特性。Hooks是一种可以让你在函数组件中“钩入”React特性的函数。以下是一些常用的ReactHooks,并附有详细的用法和代码示例。1.useStateuseState是一个Hook函数,让......
  • 第一节:Lvs软件负载技术详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Hive Merge详解
    说明Hive在2.2版本之后开始支持Merge操作,并且Merge只能在支持ACID的表上执行语法MERGEINTO<targettable>ASTUSING<sourceexpression/table>ASSON<booleanexpression1>WHENMATCHED[AND<booleanexpression2>]THENUPDATESET<setclauselist>WHEN......
  • 9.2.Config Server 配置规则详解
    9.2.ConfigServer配置规则详解在上面,我们用于测试的配置文件:futurecloud.ymlfuturecloud-dev.ymlfuturecloud-test.ymlfuturecloud-pre.ymlfuturecloud-stable.ymlfuturecloud-apigetway-zuul.yml“-”前面的部分可以随便定义,一般我们用应用名来定义,后面的deb、test…也可以随......