Semaphore源码分析
生活随笔
收集整理的這篇文章主要介紹了
Semaphore源码分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從Semaphore的功能來看,我們基本能猜測到它的底層實現一定是基于AQS的共享所,因為需要實現多個線程共享一個領排池
創建?Semaphore?實例的時候,需要一個參數?permits,這個基本上可以確定是設置給?AQS?的?state?的,然后每個線程調用?acquire?的時候,執行?state = state?-?1,release?的時候執行?state = state + 1,當然,acquire?的時候,如果?state = 0,說明沒有資源了,需要等待其他線程
release。
Semaphore分公平策略和非公平策略
FairSync
static final class FairSync extends Sync { private static final long serialVersionUID = 2014338818796000944L; FairSync(int permits) { super(permits); } protected int tryAcquireShared(int acquires) { for (;;) { // 區別就在于是不是會先判斷是否有線程在排隊,然后才進行 CAS 減操作 if (hasQueuedPredecessors()) return -1; int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } } }NofairSync
通過對比發現公平和非公平的區別就在于是否多了一個hasQueuedPredecessors的判斷
static final class NonfairSync extends Sync { private static final long serialVersionUID = -2694183684443567898L; NonfairSync(int permits) { super(permits); } protected int tryAcquireShared(int acquires) { return nonfairTryAcquireShared(acquires); } } final int nonfairTryAcquireShared(int acquires) { for (;;) { int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } }由于后面的代碼和CountDownLatch的是完全一樣,都是基于共享鎖的實現,所以也就沒必要再花時間來分析了。
?
總結
以上是生活随笔為你收集整理的Semaphore源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: setHeadAndPropagate
- 下一篇: ConcurrentHashMap的初步