一、AQS

Java并发包(JUC)中提供了很多并发工具,ReentrangLock、Semaphore、CountDownLatch,它们的实现都用到了一个共同的基类——AbstractQueuedSynchronizer,简称AQS。

AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等皆是基于AQS的

二、基本实现原理

AQS维护一个共享资源state,通过内置的FIFO来完成获取资源线程的排队工作。该队列由一个一个的Node结点组成,每个Node结点维护一个prev引用和next引用,分别指向自己的前驱和后继结点,双端双向链表。

private volatile int state;//共享变量,使用volatile修饰保证线程可见性

状态信息通过procted类型的getState,setState,compareAndSetState进行操作

三、AQS两种同步方式

独占式、共享式

独占式如ReentrantLock

共享式如Semaphore,CountDownLatch,

组合式的如ReentrantReadWriteLock

(1)独占式
acquire
a.首先tryAcquire获取同步状态,成功则直接返回;否则,进入下一环节;
b.线程获取同步状态失败,就构造一个结点,加入同步队列中,这个过程要保证线程安全;
c.加入队列中的结点线程进入自旋状态,若是老二结点(即前驱结点为头结点),才有机会尝试去获取同步状态;否则,当其前驱结点的状态为SIGNAL,线程便可安心休息,进入阻塞状态,直到被中断或者被前驱结点唤醒。
release
release的同步状态相对简单,需要找到头结点的后继结点进行唤醒,若后继结点为空或处于CANCEL状态,从后向前遍历找寻一个正常的结点,唤醒其对应线程。

(2)共享式
共享式地获取同步状态,同步状态的方法tryAcquireShared返回值为int。
a.当返回值大于0时,表示获取同步状态成功,同时还有剩余同步状态可供其他线程获取;
b.当返回值等于0时,表示获取同步状态成功,但没有可用同步状态了;
c.当返回值小于0时,表示获取同步状态失败。

(3)模板方法模式
 protected boolean tryAcquire(int arg) : 独占式获取同步状态,试着获取,成功返回true,反之为false
 protected boolean tryRelease(int arg) :独占式释放同步状态,等待中的其他线程此时将有机会获取到同步状态;
 protected int tryAcquireShared(int arg) :共享式获取同步状态,返回值大于等于0,代表获取成功;反之获取失败;
 protected boolean tryReleaseShared(int arg) :共享式释放同步状态,成功为true,失败为false
(5)双向链表Node节点的状态
CANCELLED,值为1,表示当前的线程被取消;
SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;
值为0,表示当前节点在sync队列中,等待着获取锁。

(6)AQS实现公平锁和非公平锁
非公平锁中,那些尝试获取锁且尚未进入等待队列的线程会和等待队列head结点的线程发生竞争。

公平锁中,在获取锁时,增加了isFirst(current)判断,当且仅当,等待队列为空或当前线程是等待队列的头结点时,才可尝试获取锁。

Java 并发总结——AQS相关推荐

  1. 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...

  2. Java并发编程—AQS原理分析

    目录 一.AQS原理简述 二.自定义独占锁及共享锁 三.锁的可重入性 四.锁的公平性 五.惊群效应 AQS全称AbstractQueuedSynchronizer,它是实现 JCU包中几乎所有的锁.多 ...

  3. java并发编程-AQS

    1.什么是AQS AQSjava.util.concurrent.locks.AbstractQueuedSynchronizer抽象队列同步器 ,是用来构建锁或者其他同步组件的基础框架.它使用了一个 ...

  4. Java并发同步器AQS

    AQS是AbstractQueuedSynchronizer的简写,中文名应该叫抽象队列同步器(我给的名字,哈哈),出生于Java 1.5. 一.什么是同步器 多线程并发的执行,之间通过某种 共享 状 ...

  5. Java并发框架——AQS之怎样使用AQS构建同步器

    AQS的设计思想是通过继承的方式提供一个模板让大家能够非常easy依据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即能够实现不同的锁机制. AQS的设计必须考 ...

  6. 吃透Java并发:AQS结构详解及其CLH变种、CLH、MCS

    目录 1.前言 2.AQS的构成 2.1 状态信息state 2.2 节点信息Node 2.3 阻塞/唤醒 2.4 当前持有锁线程 2.5 头结点与尾节点 3.CLH队列 3.1 CLH锁 3.2 M ...

  7. 大厂高频面试题之Java并发核心AQS源码详解

    文章目录 什么是AQS AQS做了什么 AQS是如何保证并发安全的 父类 AbstractOwnableSynchronizer 主要成员变量 CLH队列 静态内部类Node waitStatus取值 ...

  8. Java并发编程AQS详解

    本文内容及图片代码参考视频:https://www.bilibili.com/video/BV12K411G7Fg/?spm_id_from=333.788.recommend_more_video. ...

  9. Java 并发编程AQS基本介绍

    what-什么是AQS? AQS是AbstractQueuedSynchronizer的简称.直译就是"抽象队列同步器". 它定义了一套多线程访问共享资源的同步框架,需要同步类实现 ...

最新文章

  1. Hystrix文档-实现原理
  2. 一块网卡设置多个IP地址
  3. 算法设计与分析 矩阵连乘问题 动态规划
  4. 揭秘了!小米透明电视所用处理器为联发科定制
  5. 文档布局分析 扭曲文档图像恢复
  6. 三菱5uplc伺服电机指令_?2020/9/12三菱PLC触摸屏控制POWSD-伺服电机
  7. 爬虫笔记9:session在突破12306图片验证中的作用
  8. c语言常用英语带音标,C语言常见英语单词,带音标
  9. python中round函数参数有负数_Python中round函数使用注意事项
  10. Web前端之样式继承与其他概念
  11. 每个Web开发者都应读的文章:HTML5设计原理
  12. DNA旋转特效 html+css
  13. dev c++怎么设置断点_斑马进度计划软件可以检查计划中是否存在逻辑断点和错误逻辑关系...
  14. 英格兰 VS 特利尼达和多巴哥
  15. B、dB、dBm、dBi、dBd、dBc的含义与区别
  16. 【MFC】打开资源视图对话框,提示未注册控件
  17. 微型计算机一般只具有定点运算功能吗,计算机单选题 (100道) 1.doc
  18. 计算机应用 高职教案,关于高职院校计算机应用论文
  19. [DUBBO] Expected single matching of monitor, but found 2 instances, will randomly pick the first one
  20. windows开源版的pymol安装方法

热门文章

  1. python——学习笔记1
  2. C++ 学习之旅(4)——调试Debug
  3. [高等数学]这你不背?
  4. [蓝桥杯2017初赛]等差素数列-巧妙枚举(思维)
  5. C++用Prim算法实现无向图最小生成树
  6. 哈希表-拉链法及应用举例
  7. mysql开启gtid dump_mysqldump关于--set-gtid-purged=OFF的使用
  8. B. Alyona and a tree(dsu on tree + bit)
  9. HDU 6703 array(主席树 + set)
  10. Legacy(线段树优化建边跑Dijkstra)