- 2021-11-29
- Views (
1,422 ) - Comments (0)
Java并发编程之8——AQS如何实现Semaphore
Semaphore的实现和ReentrantLock的实现很相似,都有公平和非公平两种实现。本文的分析可以对比 LOCK源码分析 和 CountDownLatch源码分析 对比看。这样可以看出AQS的几条关键执行路径。
非公平信号量的实现
构造函数
信号量的默认实现也是采用非公平锁,构造函数如下:
|
|
|
|
许可的获取
获取许可直接调用的是AQS的acquire方法
|
|
这里的实现过程和Lock完全一样,先由子类判断是否可以获取许可,如果可以获取成功,就将同步状态减一,然后继续执行,如果不能获取到锁,就将当前线程挂起
|
|
分析:Sync类如何判断是否可以获取到许可。
|
|
|
|
温习: 获取信号量失败的时候,AQS如何构造等待线程列表。
|
|
许可的释放
|
|
sync类的releaseShared调用的是AQS的方法,他的实现过程是:先由子类去释放信号量,如果是否成功,就激活等待信号量队列的第一个线程。
|
|
子类释放许可的过程:就是简单的CAS将许可的数量加1
|
|
在子类释放许可成功之后,AQS释放等待队列的第一个等待获取信号量的线程
|
|
公平信号量的实现
公平信号量的实现和非公平的信号量的实现基本一样。可以参考我的上一篇文章: LOCK源码分析
赞 0
赏
分享
Category:Technology
本文目录
- No relevant articles
- Java并发编程之3——Java锁的分析
- MySQL之2--存储引擎选择与比较
- Java并发编程之5——AQS-AbstractQueuedSynchronizer-源码分析
- MySQL之1--MySQL事物隔离级别
- Jump Consistant Hash
- Java并发编程之6——AQS如何实现CountDownLatch
- Java并发编程之7——AQS如何实现ReentrantLock
- Java并发编程之9——如何理解Condtion
- Java并发编程之2——同步工具类 CountDownLatch,CyclicBarrier,BlockungQueue,Semaphore
- Java并发编程之8——AQS如何实现Semaphore
SiteInfo
- TotalArticles:17
- TotalLabels:7
- TotalCategories:4
- TotalComments:0