一、什么是AQS

AQS(AbstractQueuedSynchronize:队列同步器)是用来构建锁或者其他同步组件的基础框架,很多同步类都是在它的基础上实现的,比如常用的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore。

二、实现原理

在AQS内部,定义了一个 volatile int state 变量来标识同步状态,通过改变state的状态来控制对共享资源的访问,根据不同的实现,state可以表示不同的状态,例如:在 ReentrantLock中它表示拥有该锁的线程请求了多少次该锁;在 Semaphore 中表示剩余的许可数,在 FutureTask中表示任务的状态(尚未开始、运行、完成和取消)。同时定义了一个 FIFO 队列维护争用资源时被阻塞的线程,当线程尝试获取锁时,如果锁已经被占用,那么该线程就会被构造成一个Node节点放到同步队列的尾部;队列的头节点是成功获取锁的节点,当头节点线程释放锁时,会唤醒后面的节点并释放当前头节点的引用。

AQS主要通过继承的方式来使用,子类通过继承AQS并实现它的抽象方法来定义state变量的具体的访问规则,从而可以实现不同类型的同步组件。AQS定义了两种资源共享的方式:独占式和共享式。

独占式:同时只有一个线程能访问该共享资源。

共享式:多个线程可以同时访问该共享资源。

AQS中可重写的方法如下:

protected boolean tryAcquire(int arg):独占式获取同步状态,成功则返回true,失败则返回false。先查询同步状态并判断同步状态是否符合预期,然后再进行CAS设置同步状态。

protected boolean tryRelease(int arg):独占式释放同步状态,成功则返回true,失败则返回false。等待获取同步状态的线程将有机会获取同步状态。

protected int tryAcquireShared(int arg):共享式获取同步状态,返回大于等于0的值,表示成功,该值表示剩余可用资源数,小于0则表示获取失败。

protected boolean tryReleaseShared(int arg):共享式释放同步状态,如果释放后允许唤醒后续等待结点返回true,否则返回false。

protected boolean isHeldExclusively():当前同步器是否在独占模式下被线程占用,只在 AbstractQueuedSynchronizer.ConditionObject 的方法内进行内部调用,不使用Condition可以不重写。

AQS自身没有实现任何同步接口,为了保证对state的访问修改操作是安全的,重写AQS指定的方法时,需要使用它提供的如下3个方法来访问或修改同步状态:

getState():获取当前同步状态。

setState(int newState):设置当前同步状态。

compareAndSetState(int expect,int update):使用CAS设置当前状态,该方法能够保证状态设置的原子性。

AQS是实现锁(同步组件)的关键,它在底层对同步状态管理、线程的排队、等待与唤醒做了实现,简化锁的实现。AQS是基于模板方法模式设计的,使用时需要继承AQS并重写对应的方法,再将其组合在同步组件中,当使用同步组件访问共享资源时,调用AQS提供的模板方法,然后模板方法会调用重写的方法。

原文:https://www.cnblogs.com/Mr-XiaoLiu/p/9985408.html

java 并发编程 aqs_Java并发编程之AQS相关推荐

  1. java网络编程udp_Java网络编程之UDP

    UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议, ...

  2. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

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

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

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

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

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

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

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

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

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

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

  8. Java并发编程之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  9. java并发编程_Java并发编程之 synchronized

    大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...

最新文章

  1. linux下压缩工具总结与使用(参考私房菜)
  2. ASP.NET防伪令牌与JSON有效载荷
  3. Openlayers下载与加载geoserver的wms服务显示地图
  4. Android MediaPlayer
  5. 深度学习训练的时候gpu占用0_26秒单GPU训练CIFAR10,Jeff Dean也点赞的深度学习优化技巧...
  6. python地理空间分析指南pdf邓世超_Python地理空间分析指南(第2版)源代码.zip
  7. 5个常见的Hibernate异常及其解决方法
  8. 综述 | 联邦学习-新兴的人工智能基础技术
  9. 90%的人都做错的用户画像,到底应该怎么做?
  10. 31.卷1(套接字联网API)---流
  11. ant design-Table中的分页实现(包括点击跳页,输入跳页,以及指定每页项目数)
  12. c++ 十六进制转二进制数_二进制数制
  13. 计算机算法基础_如何自学计算机专业
  14. 机器学习笔记15——决策树(DT)、ID3算法、C4.5算法原理以及python实现案例
  15. 简要分析网络三层架构(核心层、汇聚层、接入层)
  16. Linux 帮助手册安装
  17. C++左移<<运算符详解
  18. Pygame - Python游戏编程入门(3)
  19. pe备份linux系统教程,如何使用老毛桃winpe的Bootice工具备份SYSLINUX引导程序?
  20. 蓝牙4.0--Android BLE(二)BleLib开源库

热门文章

  1. Java从入门到精通——数据库篇之JAVA中的对Oracle数据库操作
  2. JavaScript精要
  3. VB6.0 怎样启用控件comdlg32.ocx
  4. 存在于实数域的微观粒子7-神经网络与电磁场
  5. 将成化学键的成键过程理解成是用分子测量本征值的过程
  6. 2.9 学习率衰减-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  7. python基础4(来自廖雪峰的官方网站)
  8. Win10 基于excel 文件的python下载脚本
  9. KLayout 软件使用崩溃
  10. 好好学python · 元组