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相关推荐

  1. Android工程师转型Java后端开发之路,自己选的路,跪着也要走下去!

    本文是公众号读者jianfeng投稿的面试经验 恭喜该同学成功转型 目录: 毅然转型,没头苍蝇 制定目标,系统学习 面试经历 毅然转岗,没头苍蝇 首先,介绍一下我的背景.本人坐标广州,2016年毕业于 ...

  2. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

  3. Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化

    第09讲:Java 线程优化 偏向锁,轻量级锁.重量级锁 我目前所在的公司是一家跨国企业,总部在瑞典.前段时间公司新开发的一个应用准备发布到应用宝平台.但是在发布之前,需要准备一系列软著相关的证明材料 ...

  4. 字节跳动Android开发大牛:90% 成功率的 BATZ Offer 收割机是怎样练成的!

    都说今年的形势不好,各种找工作不顺利,但我身边就有一位同学,每次面试都拿到了offer,我特意邀请他来给大家分享下经验,虽然不同人的技术领域未必相同,但很多东西是相通的,希望本文能对大家有所帮助. 前 ...

  5. “金三银四” “阿里” 我去定了,谁也拦不住我,这份《Android面试宝典》说的

    前言: 面试,跳槽,每天都在发生,而对程序员来说"金三银四"更是面试和跳槽的高峰期,跳槽,更是很常见的,对于每个人来说,跳槽的意义也各不相同,可能是一个人更向往一个更大的平台,更好 ...

  6. 金三银四阿里我去定了,谁也拦不住我,这份《Android面试宝典》说的

    前言: 面试,跳槽,每天都在发生,而对程序员来说"金三银四"更是面试和跳槽的高峰期,跳槽,更是很常见的,对于每个人来说,跳槽的意义也各不相同,可能是一个人更向往一个更大的平台,更好 ...

  7. 年末最新整理:阿里、腾讯、字节、华为、百度等大厂Android岗面经分享!

    缘起 很多人挤破脑袋,破釜沉舟的想进大厂的根本原因还是大厂和小公司真的不一样.我是双非本科15年毕业的,毕业之后就一直在做Android相关方面的开发工作,到18年经历了两家创业公司,一家工作了不到半 ...

  8. 最新整理:阿里、腾讯、字节、华为、百度等大厂Android岗面经分享!

    缘起 很多人挤破脑袋,破釜沉舟的想进大厂的根本原因还是大厂和小公司真的不一样.我是双非本科15年毕业的,毕业之后就一直在做Android相关方面的开发工作,到18年经历了两家创业公司,一家工作了不到半 ...

  9. 网易被裁后,68天吃透这份阿里学长甩我的Android面试笔记,竟让我收到字节跳动和小米offer

    自我情况介绍一下: 楼主双非本科,17年毕业,学历背景一般,之前一直在网易工作,生活状态还算是稳定,国庆节后突然被裁彻底打破了我的生活节奏,将近一个月都处在懵逼状态(哪个环节出问题了,导致被裁),在咨 ...

  10. Android 面试必备 - 线程

    前言 最近准备更新 Android 面试必备基础知识系列,有兴趣的可以关注我的微信公众号 stormjun94,有更新时,第一时间会在微信公众号上面发布,同时,也会同步在 GitHub 上面更新,如果 ...

最新文章

  1. ivy java_使用Ivy管理项目中的依赖
  2. No tag datetimepicker defined in tag library imported with prefix s解决
  3. Sql Server中查看/修改identity(自增列)的值
  4. 数字类 default 0和 default 0_全方位的数字规划工具Visual Components 4.0 数字化工厂仿真软件...
  5. 协程与线程, 进程的区别
  6. Python面试题之阅读下面的代码,写出A0,A1至An的最终值
  7. 我正在参加年度博客之星评选,请大家访问活动页面,帮我投票打分
  8. Linux工作笔记036---Centos下查看cpu、磁盘、内存使用情况以及如何清理内存
  9. [转载] Python pep8编码规范
  10. Oracle管理存储架构(二)--Oracle管理数据块空间
  11. 编译原理实验二C语言实现,编译原理实验报告(c语言).pdf
  12. ubuntu16.04下安装teamview12版本
  13. python json对比差异,更新json数据
  14. PDF拆分页面的方法,如何拆分PDF页面
  15. 双非年薪40W,从字节裸辞了
  16. 十几减9的口算题_一年级数学《口算十几减9》教案
  17. Verilog语言、语法
  18. 计算机专业英语教程(第二版)Chapter 4 Database Fundamentals
  19. 时间复杂度的三种常见表示符号
  20. 解题:肯前必肯后,否后必否前

热门文章

  1. 俄勒冈健康与科学大学计算机,俄勒冈健康与科学大学费用
  2. 51单片机——红外遥控 C语言入门编程
  3. ·穷途末路之举·解决VirtualBox启动问题-Error relaunching VirtualBox VM process 5/terminated with exit code1(0x1)
  4. google protobuf 在线工具
  5. CSS的小特效之:融合效果
  6. day 1 | 704. 二分查找、27. 移除元素
  7. HTML5+CSS3小实例:富有弹性的导航栏标签
  8. UE4 如何旋转模型骨骼
  9. 13-cmake语法-路径设置
  10. 小程序加密解密完成版