java 并发开发之AQS
java 并发开发之AQS
AQS 是什么,有什么作用?
① 是什么:AQS 是抽象队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖它
② 有什么作用:为Java的并发同步组件提供统一的底层支持,ReentrantLock、Semaphore、CountDownLatch等
AQS 的原理
AQS 的实现依赖FIFO双向队列(CLH队列锁的变体)和 volatile的state变量(共享资源状态)
如果当前线程竞争失败,AQS会把当前线程及等待信息(Node节点)加入到队列中,同时阻塞该线程。当获取锁的线程释放锁之后,会从队列中唤醒一个阻塞的节点。
volatile 能够保证多线程下的可见性,state的操作都是通过CAS来保证其并发修改的安全性CLH锁
CLH锁是自旋锁(spinlock),能够保证无饥饿性,提供先来先服务的公平性
CLH基于链表实现,线程在不断的自旋,不断地轮询前驱节点的状态,如果前驱节点释放了锁,那么线程结束自旋
对于持锁时间很短的场景,比之前把线程阻塞住具有更高的想能,并能保证一定的公平性
AQS 底层数据结构,Node节点有哪些状态
AQS 底层数据结构是使用的双向链表,sync queue即同步队列,是双向链表,包括head节点和tail节点,head节点主要用作后续的调度。
Node节点状态waitStatus:
① 每个节点初始状态为0
② CABCELLED,值为1,表示当前线程被取消
③ SIGNAL,值为-1,表示该节点的后续节点被挂起了,当释放锁或者取消时,需要唤醒后续节点
④ CONDITION,值为-2,表示节点处于Condition队列中
⑤ PROPAGATE,值为-3,用于共享锁,表示下一次尝试获取共享锁时,需要无条件传播下去
Node 可能是共享式的,可能是独占式的
Node 有两种构造函数
Node(Thread thread, Node mode) { //Used by addwaiterthis.nextWaiter = mode;this.thread= thread;
}Node(Thread thread, int waitStatus) { //Used by Conditionthis.waitStatus = waitStatus;this.thread= thread;
}
AQS 对资源有哪些共享方式
两种:共享share,独占Exclusive
① 共享
多个线程可以同时执行,如Semaphore、CountDownLatch、CyclicBarrier、ReentrantReadWriteLock.ReadLock
② 独占
只有一个线程能执行,如ReentrantLock、ReentrantReadWriteLock.WriteLock
AQS 底层实现,用了什么设计模式
AQS 同步器的设计是基于模板方法模式
模板方法模式是基于继承的,主要是为了在不改变模板结构的前提下在子类中重新定义模板中的内容以实现代码复用。 自定义同步器时需要重写下面几个AQS提供的模板方法:
isHeldExclusively() //该线程是否正在独占资源。只有用到condition才需要去实现它。tryAcquire(int) //独占方式。尝试获取资源,成功则返回true,失败则返回false。tryRelease(int) //独占方式。尝试释放资源,成功则返回true,失败则返回false。tryAcquireShared(int) //共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。tryReleaseShared(int) //共享方式。尝试释放资源,成功则返回true,失败则返回false。
java 并发开发之AQS相关推荐
- JAVA游戏开发之FPS精准控制
目录 JAVA游戏开发之FPS精准控制... 1 1 概述... 2 1.1 编写目的... 3 2 FPS精准控制... 3 2.1 FPS描述. ...
- Java并发编程之AQS详解
一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...
- 魔鬼在细节,理解Java并发底层之AQS实现
jdk的JUC包(java.util.concurrent)提供大量Java并发工具提供使用,基本由Doug Lea编写,很多地方值得学习和借鉴,是进阶升级必经之路 本文从JUC包中常用的对象锁.并发 ...
- Android工程师转型Java后端开发之路,自己选的路,跪着也要走下去!
本文是公众号读者jianfeng投稿的面试经验 恭喜该同学成功转型 目录: 毅然转型,没头苍蝇 制定目标,系统学习 面试经历 毅然转岗,没头苍蝇 首先,介绍一下我的背景.本人坐标广州,2016年毕业于 ...
- 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现
在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...
- java EE开发之Servlet第八课:MVC模式 (基本理解)
##1,为什么需要MVC模式? 为什么需要MVC模式,以前简单的JSP页面处理不好吗?MVC有什么好处呢? 答:MVC就是常说的: 模型(Model):POJO(Plain Old Java Obje ...
- Java并发编程之AQS以及源码解析
文章目录 概览 实现思路 实现原理 源自CLH锁 AQS数据模型 CAS操作 主要方法 自定义同步器的实现方法 AQS定义的模板方法 源码解读 等待状态释义 AQS获取锁的流程图 获取独占锁的实现 总 ...
- (022)java后台开发之HttpServletRequest
本文转载自:Servlet运行原理及404.500.405异常原因和解决方法总结 一.Servlet运行原理 比如,在浏览器地址栏输入http://ip:port/web01/hello,整个通信流程 ...
- (020)java后台开发之JAVA集合中的List接口
转载:http://blog.csdn.net/self_realian/article/details/51881977 原文写的很好.请看原文. JAVA中的集合类: JAVA中的集合类,是一种工 ...
最新文章
- 电商系统的售后模块设计
- 【HBuilder】手机App推送至Apple App Store过程
- 什么是云原生?有哪些发展方向?终于有人讲明白了
- jsp mysql简单登录_简单的登录页面,实现增删改查运用jsp/servlet和mysql数据库免费分享...
- my javaeye blog
- iPhone工厂骚乱损失至多712万美元?纬创资讯回应...
- iwrite提交不了作业_痛点!为什么开发了那么多软件,还是解决不了教学问题!...
- SAP WM 工单完工入库,系统报错- No SU type could be determined -
- read()/write()的生命旅程之五——第五章:从bio到media
- 卡巴斯基的离线更新以及病毒库备份
- layUI中table重载后表头时间控件失效解决方法,已实践
- java将Map转换为List
- 像素值与灰度值的区别与关系
- oc引导windows蓝屏_使用Opencore引导ubuntu以及Linux的步骤
- ubuntu16.04搭建samba服务器
- 红帽linux5.4安装教程,红帽企业Linux5.4下ORACLE安装步骤(推荐).pdf
- Vue 如何清除Form 表单验证二次弹出表单 清除验证上次提示信息
- 企业邮箱品牌哪家好?四大品牌企业邮箱推荐
- Python 列表推导式的实用小技巧
- Vue2.0的三种常用传值方式、父传子、子传父、非父子组件传值