本文将通过剖析Semaphore
的源码来介绍其实现原理
关于CountDownLatch
的基本内容请参考「并发 - JUC - CountDownLatch - 源码剖析」,本文不再赘述
基础
Semaphore
与CountDownLatch
非常类似,都是基于AQS
的共享模式
,CountDownLatch
可以大致理解为简化版的Semaphore
CountDownLatch.await
等待的是state=0
,Semaphore.acquire
(如果需要等待)等待的是Semaphore.release
Semaphore
与CountDownLatch
的源码非常类似,因此有些共通或类似的代码不再重复分析
源码分析
构造函数
1 | // 与ReentrantLock非常类似,默认是非公平策略 |
acquireUninterruptibly
1 | // From Semaphore |
1 | // From Semaphore |
acquireShared
1 | // From AQS |
tryAcquireShared
1 | // From FairSync |
1 | // From NonfairSync |
doAcquireShared
1 | // From AQS |
release
1 | // From Semaphore |
releaseShared
1 | // From AQS |
tryReleaseShared
1 | // From Semaphore |
现在回顾下CountDownLatch
中tryReleaseShared
的具体实现,没有用到参数releases
,直接采用”-1
“
1 | // From CountDownLatch |
doReleaseShared
1 | // From AQS |