上一篇 <<<CountDownLatch同步計(jì)數(shù)器
下一篇 >>>CyclicBarrier屏障
工作原理
a.可以設(shè)置Semaphore信號(hào)量的 狀態(tài)state值為5
b.當(dāng)一個(gè)線程獲取到鎖的情況下婚夫,將state-1泰讽,鎖釋放成功之后state+1;
c.當(dāng)state<0佳吞,表示沒鎖的資源揣炕,則當(dāng)前線程阻塞鄙煤。
- 計(jì)數(shù)信號(hào)量-Semaphore
- 多個(gè)線程競(jìng)爭(zhēng)獲取許可信號(hào)离唬,申請(qǐng)到的做好自己的事情后歸還凿歼,超過閾值后梯轻,線程申請(qǐng)?jiān)S可信號(hào)將會(huì)被阻塞
- new Semaphore(3); 總資源數(shù)
- wc.acquire();申請(qǐng)資源
- wc.release(); 釋放資源
基于AQS手寫Semaphore核心代碼
/**
* 構(gòu)造函數(shù)設(shè)置aqs的state
* @param count state值
*/
public MySemaphore(int count) {
this.sync = new Sync(count);
}
/**
* 重寫阻塞的條件食磕,分為公平和非公平,這里只考慮非公平
* 默認(rèn)設(shè)置了state喳挑,當(dāng)有執(zhí)行的時(shí)候彬伦,state就會(huì)減少,一旦小于0就阻塞伊诵,不讓繼續(xù)執(zhí)行
* @param acquires
* @return
*/
@Override
protected int tryAcquireShared(int acquires) {
for (;;) {
int available = getState();
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining)) {
return remaining;
}
}
}
/**
* 使用自旋機(jī)制单绑,當(dāng)執(zhí)行完后,state會(huì)加回去日戈,自動(dòng)喚醒阻塞隊(duì)列
* @param releases 步長(zhǎng)询张,正常情況均為1
* @return
*/
@Override
protected boolean tryReleaseShared(int releases) {
for (;;) {
int current = getState();
int next = current + releases;
// 防止溢出
if (next < current) {
throw new Error("Maximum permit count exceeded");
}
if (compareAndSetState(current, next)) {
return true;
}
}
}
相關(guān)文章鏈接:
<<<多線程基礎(chǔ)
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內(nèi)存模型(JMM)
<<<Volatile解決JMM的可見性問題
<<<Volatile的偽共享和重排序
<<<CAS無鎖模式及ABA問題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步計(jì)數(shù)器
<<<CyclicBarrier屏障
<<<線程池
<<<并發(fā)隊(duì)列
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結(jié)