Android-AQS
AQS
什么是AQS?
AQS,全程AbstractQueuedSynchronizer,位于java.util.concurrent.locks包下,是JDK1.5提供的一套用于实现阻塞锁和一系列依赖FIFO等待队列的同步机器(First Input First Output先进先出)的框架实现,是除了java自带的synchronized关键字之外的锁机制,可以将AQS作为一个队列来理解。
我们常用的ReentrantLock,Semaphore,CountDownLatch,CyclicBarrier等并发类均是基于AQS来实现的,具体用法是通过继承AQS,并实现其模板方法,来达到同步状态的管理。
AQS的功能在使用中可以分为两种:独占锁和共享锁
独占锁:每次只能有一个线程持有锁,ReentrantLock就是独占锁
共享锁:允许多个线程同时获得锁,并发访问共享资源,ReentrantReadWriteLock中的读。
核心思想:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
doglee帮我们搭出了一个基础的锁实现的架子,ReentrantLock是doglee帮我们实现的锁。
重点
本质:是提供自己去写锁的一个规范,从使用的角度就是自己去继承和实现AbstractQueuedSynchronizer,但是具体已经有人帮我们写了ReentrantLock,ReentrantLockReadWriteLock读写锁,AQS体系实现了不同的对于锁的应用,AQS是依托业务来开发并发工具,底层原理应用的是CAS原子变量+队列+Park+unpark的支撑来添加业务去具体实现锁的定义。
synchronize是底层对于基础锁的支持。
AQS使用方法
AQS设计是基于模板方法模式的,一般的使用方式是:
1.使用者继承AbstractQueuedSynchronizer并重写指定的方法,这些重写方法很简单,无非是对共享资源state的获取和释放。
2.将AQS组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法
AQS定义的这些可重写的方法:
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
protected boolean isHeldExclusively():是否在独享模式下被线程占用
AQS的模板方法
独占锁可以理解为synchronize
ReentrantLock分析
1.怎么加锁?
1.1 竞争成功
if(compareAndSetState(0,1))//原子的函数,true
setExclusiveOwnerThread(Thread.currentThread());
1.2 竞争不成功
获取当前线程
获取状态
重试 成功就竞争成功
不成功锁重入(锁重入,规避死锁,默认状态值往上递增,其实就是做了一次计数)
!tryAcquire(arg)进行尝试与重入处理,如果还不行 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)
主要功能:
addWaiter进行入队的
acquireQueued进行park等待唤醒的=wait
!tryAcquire(arg)进行尝试与重入处理
2.怎么解锁?
3.内部的阻塞队列是啥?
4.ReentrantLock原理
默认是非公平锁
同步方案对比
wait/notify:依托于synchronized,基于VM底层对于阻塞的实现,使用waitSet作为等待机制
await/signal:依托于ReentrantLock条件变量,已经用条件变量与AQS体系作为唤醒机制,本质上层次是partk/unpark实现阻塞
park/unpark:以thread为操作对象,操作更精准,可以准确的唤醒某一个线程(notify随机唤醒一个线程,notifyAll唤醒所有等待的线程),增加了灵活性。
Object obj = new Object();
synchronized(obj){try{obj.wait();} catch(InterruptedException e) {e.printStackTrace();}
}
wait/notify本身依托于Monitor对象,因此,必须放到synchronized中去,这样才能找到waitset
并发编程的总结:
1.内存模型(最根本的是吸收JAVA对于线程处理在内存数据角度的本质是什么)
2.JVM锁机制(Java常规情况下对于同步处理的手段是怎么做的)
3.原子变量-CAS无锁并发(常规手段的优化–>CAS理论来支撑对于无锁并发的处理)
4.线程池(对于线程的优化在于如何合理的利用CPU的核数的优势)
5.AQS(如何针对专门的业务,利用CAS与PARK机制,完成对于特殊业务定制化同步诉求)
6.三高的处理(涉及到服务端)
Android-AQS相关推荐
- Android工程师转型Java后端开发之路,自己选的路,跪着也要走下去!
本文是公众号读者jianfeng投稿的面试经验 恭喜该同学成功转型 目录: 毅然转型,没头苍蝇 制定目标,系统学习 面试经历 毅然转岗,没头苍蝇 首先,介绍一下我的背景.本人坐标广州,2016年毕业于 ...
- android热补丁作用,Android热修复之 - 阿里开源的热补丁
这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...
- Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化
第09讲:Java 线程优化 偏向锁,轻量级锁.重量级锁 我目前所在的公司是一家跨国企业,总部在瑞典.前段时间公司新开发的一个应用准备发布到应用宝平台.但是在发布之前,需要准备一系列软著相关的证明材料 ...
- 字节跳动Android开发大牛:90% 成功率的 BATZ Offer 收割机是怎样练成的!
都说今年的形势不好,各种找工作不顺利,但我身边就有一位同学,每次面试都拿到了offer,我特意邀请他来给大家分享下经验,虽然不同人的技术领域未必相同,但很多东西是相通的,希望本文能对大家有所帮助. 前 ...
- “金三银四” “阿里” 我去定了,谁也拦不住我,这份《Android面试宝典》说的
前言: 面试,跳槽,每天都在发生,而对程序员来说"金三银四"更是面试和跳槽的高峰期,跳槽,更是很常见的,对于每个人来说,跳槽的意义也各不相同,可能是一个人更向往一个更大的平台,更好 ...
- 金三银四阿里我去定了,谁也拦不住我,这份《Android面试宝典》说的
前言: 面试,跳槽,每天都在发生,而对程序员来说"金三银四"更是面试和跳槽的高峰期,跳槽,更是很常见的,对于每个人来说,跳槽的意义也各不相同,可能是一个人更向往一个更大的平台,更好 ...
- 年末最新整理:阿里、腾讯、字节、华为、百度等大厂Android岗面经分享!
缘起 很多人挤破脑袋,破釜沉舟的想进大厂的根本原因还是大厂和小公司真的不一样.我是双非本科15年毕业的,毕业之后就一直在做Android相关方面的开发工作,到18年经历了两家创业公司,一家工作了不到半 ...
- 最新整理:阿里、腾讯、字节、华为、百度等大厂Android岗面经分享!
缘起 很多人挤破脑袋,破釜沉舟的想进大厂的根本原因还是大厂和小公司真的不一样.我是双非本科15年毕业的,毕业之后就一直在做Android相关方面的开发工作,到18年经历了两家创业公司,一家工作了不到半 ...
- 网易被裁后,68天吃透这份阿里学长甩我的Android面试笔记,竟让我收到字节跳动和小米offer
自我情况介绍一下: 楼主双非本科,17年毕业,学历背景一般,之前一直在网易工作,生活状态还算是稳定,国庆节后突然被裁彻底打破了我的生活节奏,将近一个月都处在懵逼状态(哪个环节出问题了,导致被裁),在咨 ...
- Android 面试必备 - 线程
前言 最近准备更新 Android 面试必备基础知识系列,有兴趣的可以关注我的微信公众号 stormjun94,有更新时,第一时间会在微信公众号上面发布,同时,也会同步在 GitHub 上面更新,如果 ...
最新文章
- ivy java_使用Ivy管理项目中的依赖
- No tag datetimepicker defined in tag library imported with prefix s解决
- Sql Server中查看/修改identity(自增列)的值
- 数字类 default 0和 default 0_全方位的数字规划工具Visual Components 4.0 数字化工厂仿真软件...
- 协程与线程, 进程的区别
- Python面试题之阅读下面的代码,写出A0,A1至An的最终值
- 我正在参加年度博客之星评选,请大家访问活动页面,帮我投票打分
- Linux工作笔记036---Centos下查看cpu、磁盘、内存使用情况以及如何清理内存
- [转载] Python pep8编码规范
- Oracle管理存储架构(二)--Oracle管理数据块空间
- 编译原理实验二C语言实现,编译原理实验报告(c语言).pdf
- ubuntu16.04下安装teamview12版本
- python json对比差异,更新json数据
- PDF拆分页面的方法,如何拆分PDF页面
- 双非年薪40W,从字节裸辞了
- 十几减9的口算题_一年级数学《口算十几减9》教案
- Verilog语言、语法
- 计算机专业英语教程(第二版)Chapter 4 Database Fundamentals
- 时间复杂度的三种常见表示符号
- 解题:肯前必肯后,否后必否前
热门文章
- 俄勒冈健康与科学大学计算机,俄勒冈健康与科学大学费用
- 51单片机——红外遥控 C语言入门编程
- ·穷途末路之举·解决VirtualBox启动问题-Error relaunching VirtualBox VM process 5/terminated with exit code1(0x1)
- google protobuf 在线工具
- CSS的小特效之:融合效果
- day 1 | 704. 二分查找、27. 移除元素
- HTML5+CSS3小实例:富有弹性的导航栏标签
- UE4 如何旋转模型骨骼
- 13-cmake语法-路径设置
- 小程序加密解密完成版