文章目录

  • J.U.C脑图
  • J.U.C核心AQS简介
    • AQS底层数据结构
    • AQS特点

J.U.C脑图



为了体现出AQS和线程池的重要性,上图单独将AQS和线程池拿出来了。

J.U.C的构成如下:


J.U.C核心AQS简介

并发编程-14线程安全策略之并发容器(J.U.C)中的集合类中介绍了J.U.C中的Collections集合 ,这篇博文我们将继续来看下J.U.C中的 AQS抽象队列同步器

AQS(AbstractQueuedSynchronizer)是并发容器中的同步器,AQS是J.U.C的核心,它是抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,我们常用的ReentrantLock、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTask都依赖于该抽象类等。


AQS底层数据结构

如上图,AbstractQueuedSynchronizer底层数据结构是一个双向链表,是队列的一种实现

  • Sync queue:同步队列,其中head节点主要负责后面的调度
  • Condition queue:单向链表,不是必须的,只有程序中使用到Condition的时候才会存在,可能会有多个Condition queue

AQS特点

AQS维护了一个volatile int state和一个使用Node实现的FIFO线程等待队列

  • 使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础框架

  • 利用一个int类型state表示获取锁的线程数(0没有线程获取锁,1有线程获取锁,大于1表示重入锁的数量)) ,AQS提供了三种访问方式:setState() getState()
    compareAndSetState() 这三种操作均是原子操作,其中compareAndSetState的实现依赖于UnsafecompareAndSwapInt()方法

  • 使用方法是继承,然后复写AQS中的方法,基于模板方法模式

  • 子类通过继承并通过实现它的方法(acquire和release)管理其状态

  • 可以同时实现排它锁(独占,只有一个线程能执行,如ReentrantLock)和共享锁模式(共享,多个线程可同时执行,如Semaphore/CountDownLatch). 一般情况下,子类只需要根据需求实现其中一种模式,当然也有同时实现两种模式的同步类,如ReadWriteLock

自定义同步器实现时主要实现以下几种方法:

protected boolean isHeldExclusively()    // 该线程是否正在独占资源。只有用到condition才需要去实现它。
protected boolean tryAcquire(int)        // 独占方式。尝试获取资源,成功则返回true,失败则返回false。
protected boolean tryRelease(int)        // 独占方式。尝试释放资源,成功则返回true,失败则返回false。
protected int tryAcquireShared(int)  // 共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
protected boolean tryReleaseShared(int)  // 共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。

关于AQS源码解读,请移步 https://www.cnblogs.com/waterystone/p/4920797.html


接下来我们就针对AQS中的同步组件逐一通过示例来演示

  • CountDownLatch
  • Semaphore
  • CyclicBarrier
  • ReentrantLock
  • Condition
  • FutureTask(非AQS的组件)

并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍相关推荐

  1. 并发——抽象队列同步器AQS的实现原理

    一.前言 这段时间在研究Java并发相关的内容,一段时间下来算是小有收获了.ReentrantLock是Java并发中的重要部分,所以也是我的首要研究对象,在学习它的过程中,我发现它是基于抽象队列同步 ...

  2. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

  3. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  4. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  5. 【檀越剑指大厂--并发编程】并发编程总结

    并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...

  6. 【Java并发编程】并发编程大合集

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...

  7. 并发编程——JUC并发编程知识脑图

    摘要 并发编程在软件编程中尤为突出和重要,在当今面试或工作中也是不可缺少的.作为一名高级java开发工程师,并发编程的技能已经成为了重要的一项.本博文将详细介绍并发编程中的知识点和知识脑图,帮助大家更 ...

  8. Java并发编程之AbstractQueuedSychronizer(抽象队列同步器,简称AQS)

    AbstractQueuedSychronizer(抽象队列同步器,简称AQS): JDK的并发包(包名:java.util.concurrent,以下简称JUC)下面提供了很多并发操作的工具类,如: ...

  9. Java并发编程:同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...

最新文章

  1. Android studio中出现Couldn't resolve resource @dimen/...
  2. 多媒体个人计算机的英语,计算机英语之网络多媒体篇
  3. BCH矿池新格局,Coingeek矿池曾成为BCH算力最大的矿池
  4. HBuilderX 连接电脑的模拟器问题
  5. Easy Problem 2 奇妙的数字
  6. 年龄计算、工作表合并、高级筛选(三)
  7. ALAssetsLibrary获取相册列表
  8. 隐藏apache版本号的方法
  9. POJ1256 (C++ compare函数)
  10. 洛谷P4135 作诗 --分块基础
  11. Otsu算法原理及实现
  12. hadoop搭建和指令
  13. 【python】打造一款自动扫描全网漏洞的扫描器
  14. 用c语言写一个文件加密程序,用C语言设计程序进行文件的加密
  15. 浏览器JSON的插件(JSON-handle)使用问题
  16. 计算机网络之数据链路层原理
  17. 威纶通触摸屏232脚位_威纶通触摸屏使用手册
  18. STM32的频率和占空比计算
  19. 搜索技术【启发式搜索】 - 简介 A* 算法 IDA*算法
  20. 计算机网络:移动IP

热门文章

  1. 计算机视觉编程——多视图几何
  2. 113. Leetcode 674. 最长连续递增序列 (动态规划-子序列问题)
  3. Leetcode 48. 旋转图像 (每日一题 20210813)
  4. 李宏毅线性代数笔记3:行列式det
  5. 生物计算论文笔记1:The construction of next-generationmatrices for compartmentalepidemic models
  6. 文巾解题 leetcode993. 二叉树的堂兄弟节点
  7. 阿里数据中台系列之Apsara Stack控制台初始化配置及资源管理(二)
  8. python 函数的*args,**kwargs
  9. view函数_数据科学系列:数据处理(6)字符串函数基于R(二)
  10. 深度学习100例 | 第28天:水果的识别与分类(准确率99.9%)