在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
众所周知,AQS是一个Java提高的底层同步工具类。本文就AQS的资源共享方式,state的作用,自定义同步器的方法,CountDownLatch,Semaphore,Semaphore和RateLimiter的区别,CyclicBarrier几方面来为大家浅析Java并发工具类。
AQS维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列),用于后续的调度。此外还可能有一个或者多个的Condition单向链表,用于Condition的处理,这个单向链表不是必须的,可能不存在。
1、AQS的资源共享方式
Exclusive(独占,只有一个线程能执行,如ReentrantLock)
Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)
2、state的作用
以ReentrantLock为例,state初始化为0,表示未锁定状态。A线程lock()时,会调用tryAcquire()独占该锁并将state+1。此后,其他线程再tryAcquire()时就会失败,直到A线程unlock()到state=0(即释放锁)为止,其它线程才有机会获取该锁。当然,释放锁之前,A线程自己是可以重复获取此锁的(state会累加),这就是可重入的概念。但要注意,获取多少次就要释放多少次,这样才能保证state能回到零状态。
以CountDownLatch以例,任务分为N个子线程去执行,state也初始化为N(注意N要与线程个数一致)。这N个子线程是并行执行的,每个子线程执行完后countDown()一次,state会CAS减1。等到所有子线程都执行完后(即state=0),会unpark()调用主线程,然后调用主线程就会从await()函数返回,继续后续动作。
3、自定义同步器的方法
具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在顶层实现好了。自定义同步器实现时主要实现以下几种方法:
isHeldExclusively():该线程是否正在独占资源。只有用到condition才需要去实现它。
tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。
tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。
tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。
4、CountDownLatch
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后等待的线程就可以恢复执行任务。
常见运用场景
多线程做资源初始化,主线程先暂停等待初始化结束;每个线程初始化结束后都countDown一次,等全部线程都初始化结束后(state=0),此时主线程再继续往下执行
5、Semaphore
Semaphore可以控制某个资源可被同时访问的个数,通过acquire()获取一个许可,如果没有就等待,而release() 释放一个许可。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
常见应用场景
Semaphore可以用来做流量控制,限制可以访问某些资源(物理或逻辑的),特别公用资源有限的应用场景,比如数据库连接。
6、Semaphore和RateLimiter的区别
Semaphore:作用是限定只有抢到信号的线程才能执行,其他的都得等待。你可以设置N个信号,这样最多可以有N个线程同时执行。注意,其他的线程只是挂起了,是通过限制线程个数来进行限流。
RateLimiter:Guava的限流工具类,基于令牌桶算法实现。作用是 限制一秒内只能有N个线程执行,超过了就只能等待下一秒。注意,N是double类型。是从速率来进行限流。
7、CyclicBarrier
CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将会重置为原来的计数以便下次使用。
常见应用场景
用于多线程计算数据,最后合并计算结果的场景。每个parter负责一部分计算,最后进行数据汇总。
以上就是Java并发工具类在AQS实现的浅析,不知道大家都理解了吗?
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
MySQL数据库高级应用需要掌握哪些知识点?
MySQL数据库高级应用需要学习解了MySQL中的视图/存储过程/触发器/索引等对象的使用、常见的SQL优化的技巧、MySQL Server优化、应用优化、查询缓存优化、MySQL锁、数据库常用工具、复制和日志等方面的知识。
4948
2020-01-06 17:40:16
Java14发布有哪些更新?
今年三月份,Java发布了最新的版本Java14。本次发布的Java14更新了大量的内容,包括了JEP364、JEP365、JEP366、JEP367、打包功能、Nul、lPointerException异常信息、File API、switch语句、NUMA、JFR、Record、Solaris和SPARC端口、CMS垃圾收集器和instanceof。下面我们一起来看看这些更新的特性吧!
6196
2020-04-03 13:00:20
在IDEA中如何使用Git?详细步骤讲解
在IDEA中如何使用Git?首先我们要安装好IntelliJ IDEA,然后在IDEA中配置Git,才能开始使用Git。下面我们来详细讲解一下在IDEA中使用Git,大概需要十个步骤,分别是在IDEA中创建工程并将工程添加至Git,将文件添加到暂存区,提交文件,将代码推送到远程仓库,从远程仓库克隆工程到本地,从远程拉取代码,版本对比,创建分支,切换分支和分支合并。
9478
2020-04-30 10:34:03
MySQL数据库基础知识汇总梳理
本文对MySQL数据库基础知识进行了汇总和梳理,主要内容有认识数据库、常见数据库排行榜、SQL的概念以及DDL操作数据库。希望大家看完之后,能够能够理解数据库的概念,并且能够使用SQL语句操作数据库。
6299
2020-07-03 15:02:31
自己适不适合当一名Java程序员,从这几点判断
随着互联网的迅猛发展,编程开始进入越来越多人的视野,Java作为后端语言的扛把子,自然身价暴涨,成为了新生代年轻人最热衷的职业选择之一。来,干了这杯“Java”!
2725
2022-10-21 18:46:07