很多人都听说过Java里有个叫AQS的东西,其实AQS只是Java里的一个类AbstractQueuedSynchronizer的缩写,当我们谈论AQS时,更多的是指那些利用AQS实现的同步工具类,比如Semaphore、CountDownLatch、ReentrantLock等。

那么什么是同步工具类呢?

打个比方,你开了一家饭馆,可以容纳10桌客人同时吃饭。来客人了,如果里头吃饭的不到10桌,那么请进,如果已经有10桌在吃了,那不好意思,请排队。

同样是排队,这一次,你不开饭馆了,你组织了一个饭局,邀请了10个人过来,人齐了才能开吃,这下排队的规则就变了,客人来了,看看到场的人到没到10个,到了,好,开吃,没到,不好意思,咱们继续聊聊天,玩玩手机,等那个该死的迟到的家伙。

排队的规则不尽相同,但也有相同的地方,那就是你总要安顿好排队的客人吧?当可以进来吃饭的时候,你需要取通知客人吧?

这些各种排队系统都需要的东西,比如安顿客人、通知客人用餐,就是AQS干的活,至于具体的排队规则,则是交给具体的同步工具类去制定。

现在让我们回到二进制世界中,现在,你要同步的,不再是人,而是线程。

你要安顿的不是客人,而是线程,你要把等待的线程,放到一个队列中去,然后把它们挂起,不让它们乱动,浪费CPU;然后,在合适的时候,唤醒这些线程。

二进制世界里,Semaphore就是上面说的饭馆,专业点的翻译,叫信号量,总共10个permits,进来一个线程,就拿走一个,拿完了,其他线程就不能进来,只能等待拿到permit的线程,释放permit,这时候其他线程才有机会进去。

而CountDownLatch,没错,就是饭局,你设置了一个减数器,初始值为10,每来一个线程,减掉一个,减完还不等于0,那么线程等待,减到0时,ok,全部唤醒,放行。

Semaphore、CountDownLatch、ReentrantLock这些同步工具类,要做的,就只是写下自己的排队规则,所以看源码,你会发现这些类,注释比代码还多。

Talk is cheap. Show me the code?

Sorry, 这是一篇无码的文章。

了解AQS的原理,主要是为了更好的弄懂我们经常使用的这些同步工具类的运行机制,出了问题,好知道原因。

这里稍微分享下AQS源码里的几个关键词吧:

state状态:这是AbstractQueuedSynchronizer里一个万能的属性,具体是什么含义,全看你的使用方式,比如在CountDownLatch里,它代表了当前到达后正在等待的线程数,在Semaphore里,它则表示当前进去后正在运行的线程数

CAS: AQS里大量用了CAS(Compare and Swap)操作来修改state的值

LockSupport: AQS里用了大量的LockSupport的park()和unpark()方法,来挂起和唤醒线程

同步队列和条件队列:sync queue and condition queue,弄清楚这两个队列的关系,AQS也就弄懂大半

公平和非公平:有线程竞争,就有公平和非公平的问题。锁释放的时候,刚好有个线程过来获取锁,但这时候线程等待队列里也有线程在等待,到底是给排队时间最久的线程呢(公平),还是允许新来的线程参与竞争(不公平)?

这篇文章只是一个引子,如果你想深入学习AQS,可以自己写几个demo,然后调试看看,也可以看看我们组一位大佬写的文章:天外流星for

以上。

参考

Java Concurrency in Practice

java u码_Java AQS无码讲解相关推荐

  1. 一个好的Java程序员,是无码胜有码,你懂这话的意思吗?

    对于一个程序员来说,写多少代码不重要,重要的是解决问题的效率. 用Java解决问题的经验一个下午就能搞定的问题,为什么还要花几周的时间写 bug ? 正因为这样"无码程序员"的稀缺 ...

  2. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  3. java asc码_Java中ASC码与字符互相转化

    package com.ljq.test; /** * Java中ASC码与字符互相转化 * * @author jiqinlin * */ public class ASCTest { privat ...

  4. java地图源码_Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...

  5. java 源代码 分析_Java Collections 源码分析

    Java Collections API源码分析 侯捷老师剖析了不少Framework,如MFC,STL等.侯老师有句名言: 源码面前,了无秘密 这句话还在知乎引起广泛讨论. 我对教授程序设计的一点想 ...

  6. java 计算器源代码_Java计算器源码

    Java计算器源码 作者:王晓勃 本计算器仅供交流使用,如有错误,敬请谅解.本计算器参考了网友海上升明月的无私分享 (http://hi.baidu.com/haibing123/item/fc707 ...

  7. java file源码_java File源码理解,探索File路径

    1.方法: new File(path); 我们知道根据输入的路径path的不同 ,File可以根据path的不同格式,来访问文件.那么,path的形式有几种呢? 根据源码 可以知道,输入的路径pat ...

  8. java 打印一维码_java生成一维码

    /** * * 一维码图片生成器 * @author winter.liu * */ public class OneBarcodeUtil { /** * 生成一维码 * @param value ...

  9. java反射机制_java反射机制的讲解

    一 , 什么是java反射机制? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...

  10. Telegram邀请码机器人源码 自动发码 数量统计 无码提醒

    简介 因为论坛和部分网站需要发送邀请码邀请注册,人工发码又太慢,于是想到tg机器人发码,但是找了很多项目都没有找到类似的开源项目,偶然间看到了teelebot开源的tgAPi框架 于是参考着示例 ,用 ...

最新文章

  1. 《构建高可用Linux服务器》样书
  2. 雅思作文未来计算机的应用,9分考官级雅思大作文范文之电脑技术的忧虑
  3. webpake-node-sass 报错
  4. 南邮计算机专硕考研专业课,南京邮电大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  5. 你必须知道的几种java容器(集合类)
  6. POJ 1639 Picnic Planning:最小度限制生成树
  7. java安卓开发异步任务_Android笔记4-android之多线程和异步任务
  8. cru使用教程_显示器刷新率超频教程
  9. Charles4.62破解版本下载
  10. 计算机系军训横幅,军训横幅标语有创意精选100句
  11. 坦克大战游戏c语言,C语言开发坦克大战游戏
  12. cdn刷新api_阿里云cdn刷新api
  13. Good Bye 2018 ABCD题解
  14. 众安运维监控平台,构建devops一体化监控和运维体系
  15. window10系统onedrive无法登陆 ox8004def7
  16. 默认语言及Android平台语言支持状态(印度语)Android N 设置中语言列表介绍
  17. 信小程序参数二维码的8大使用场景
  18. elasticsearch-java客户端测试
  19. Ubuntu上qtcreator的arm-poky-linux-gnueabi-配置
  20. 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)

热门文章

  1. openstack 分布式路由器dvr
  2. 成功解决wps文档中,有些空白页费劲死活删除不掉的问题
  3. word2016添加题注|图注文献标号的交叉引用及引用的更新|添加不同类型的页码|文献自动编号|文献编号的自动引用|删除空白页
  4. 最新全志超清4K视频编解码芯片-V316处理器
  5. dijkastra算法实践poj2387
  6. 逻辑清晰四个实用原则(金字塔原理)
  7. 如何写一篇综述论文、浅谈
  8. 局域网打印机共享怎么设置_局域网如何共享打印机
  9. 金融专业英语词汇大全
  10. git push出现的问题与ssh相关