java u码_Java AQS无码讲解
很多人都听说过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无码讲解相关推荐
- 一个好的Java程序员,是无码胜有码,你懂这话的意思吗?
对于一个程序员来说,写多少代码不重要,重要的是解决问题的效率. 用Java解决问题的经验一个下午就能搞定的问题,为什么还要花几周的时间写 bug ? 正因为这样"无码程序员"的稀缺 ...
- java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet
前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...
- java asc码_Java中ASC码与字符互相转化
package com.ljq.test; /** * Java中ASC码与字符互相转化 * * @author jiqinlin * */ public class ASCTest { privat ...
- java地图源码_Java集合源码分析(四)HashMap
一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...
- java 源代码 分析_Java Collections 源码分析
Java Collections API源码分析 侯捷老师剖析了不少Framework,如MFC,STL等.侯老师有句名言: 源码面前,了无秘密 这句话还在知乎引起广泛讨论. 我对教授程序设计的一点想 ...
- java 计算器源代码_Java计算器源码
Java计算器源码 作者:王晓勃 本计算器仅供交流使用,如有错误,敬请谅解.本计算器参考了网友海上升明月的无私分享 (http://hi.baidu.com/haibing123/item/fc707 ...
- java file源码_java File源码理解,探索File路径
1.方法: new File(path); 我们知道根据输入的路径path的不同 ,File可以根据path的不同格式,来访问文件.那么,path的形式有几种呢? 根据源码 可以知道,输入的路径pat ...
- java 打印一维码_java生成一维码
/** * * 一维码图片生成器 * @author winter.liu * */ public class OneBarcodeUtil { /** * 生成一维码 * @param value ...
- java反射机制_java反射机制的讲解
一 , 什么是java反射机制? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...
- Telegram邀请码机器人源码 自动发码 数量统计 无码提醒
简介 因为论坛和部分网站需要发送邀请码邀请注册,人工发码又太慢,于是想到tg机器人发码,但是找了很多项目都没有找到类似的开源项目,偶然间看到了teelebot开源的tgAPi框架 于是参考着示例 ,用 ...
最新文章
- 《构建高可用Linux服务器》样书
- 雅思作文未来计算机的应用,9分考官级雅思大作文范文之电脑技术的忧虑
- webpake-node-sass 报错
- 南邮计算机专硕考研专业课,南京邮电大学(专业学位)计算机技术研究生考试科目和考研参考书目...
- 你必须知道的几种java容器(集合类)
- POJ 1639 Picnic Planning:最小度限制生成树
- java安卓开发异步任务_Android笔记4-android之多线程和异步任务
- cru使用教程_显示器刷新率超频教程
- Charles4.62破解版本下载
- 计算机系军训横幅,军训横幅标语有创意精选100句
- 坦克大战游戏c语言,C语言开发坦克大战游戏
- cdn刷新api_阿里云cdn刷新api
- Good Bye 2018 ABCD题解
- 众安运维监控平台,构建devops一体化监控和运维体系
- window10系统onedrive无法登陆 ox8004def7
- 默认语言及Android平台语言支持状态(印度语)Android N 设置中语言列表介绍
- 信小程序参数二维码的8大使用场景
- elasticsearch-java客户端测试
- Ubuntu上qtcreator的arm-poky-linux-gnueabi-配置
- 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)