Java AQS无码讲解

栏目: Java · 发布时间: 6年前

内容简介:很多人都听说过Java里有个叫AQS的东西,其实AQS只是Java里的一个类那么什么是同步工具类呢?打个比方,你开了一家饭馆,可以容纳10桌客人同时吃饭。来客人了,如果里头吃饭的不到10桌,那么请进,如果已经有10桌在吃了,那不好意思,请排队。

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

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

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

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

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

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

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

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

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

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

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

Talk is cheap. Show me the code?

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

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

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

  • 组合 :Effective Java里提到,组合是比继承更好的复用代码的方式,Java源码里通过组合的方式来复用AQS的,具体如何组合,看看 CountDownLatch 即可
  • state状态 :这是 AbstractQueuedSynchronizer 里一个万能的属性,具体是什么含义,全看你的使用方式,比如在 CountDownLatch 里,它代表了当前到达后正在等待的线程数,在 Semaphore 里,它则表示当前进去后正在运行的线程数
  • CAS : AQS里大量用了CAS操作来修改state的值
  • LockSupport : AQS里用了大量的LockSupport的park()和unpark()方法,来挂起和唤醒线程
  • 同步队列和条件队列 :sync queue and condition queue,弄清楚这两个队列的关系,AQS也就弄懂大半
  • 公平和非公平 :有线程竞争,就有公平和非公平的问题。锁释放的时候,刚好有个线程过来获取锁,但这时候线程等待队列里也有线程在等待,到底是给排队时间最久的线程呢(公平),还是允许新来的线程参与竞争(不公平)?

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

以上。

参考

  • Java Concurrency in Practice

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序的构造和解释

计算机程序的构造和解释

Harold Abelson、Gerald Jay Sussman、Julie Sussman / 裘宗燕 / 机械工业出版社 / 2004-2 / 45.00元

《计算机程序的构造和解释(原书第2版)》1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,1996年修订为第2版。在过去的二十多年里,《计算机程序的构造和解释(原书第2版)》对于计算机科学的教育计划产生了深刻的影响。第2版中大部分重要程序设计系统都重新修改并做过测试,包括各种解释器和编译器。作者根据其后十余年的教学实践,还对其他许多细节做了相应的修改。 海报:一起来看看 《计算机程序的构造和解释》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换