Semaphore源码分析
從Semaphore的功能來(lái)看,我們基本能猜測(cè)到它的底層實(shí)現(xiàn)一定是基于AQS的共享所,因?yàn)樾枰獙?shí)現(xiàn)多個(gè)線程共享一個(gè)領(lǐng)排池
創(chuàng)建?Semaphore?實(shí)例的時(shí)候,需要一個(gè)參數(shù)?permits,這個(gè)基本上可以確定是設(shè)置給?AQS?的?state?的,然后每個(gè)線程調(diào)用?acquire?的時(shí)候,執(zhí)行?state = state?-?1,release?的時(shí)候執(zhí)行?state = state + 1,當(dāng)然,acquire?的時(shí)候,如果?state = 0,說(shuō)明沒(méi)有資源了,需要等待其他線程
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 (;;) { // 區(qū)別就在于是不是會(huì)先判斷是否有線程在排隊(duì),然后才進(jìn)行 CAS 減操作 if (hasQueuedPredecessors()) return -1; int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } } }NofairSync
通過(guò)對(duì)比發(fā)現(xiàn)公平和非公平的區(qū)別就在于是否多了一個(gè)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的是完全一樣,都是基于共享鎖的實(shí)現(xiàn),所以也就沒(méi)必要再花時(shí)間來(lái)分析了。
?
總結(jié)
以上是生活随笔為你收集整理的Semaphore源码分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: setHeadAndPropagate
- 下一篇: ConcurrentHashMap的初步