上一篇 <<<Condition
下一篇 >>>Semaphore信號(hào)量
CountDownLatch是一種java.util.concurrent包下一個(gè)同步工具類(lèi),它允許一個(gè)或多個(gè)線(xiàn)程等待直到在其他線(xiàn)程中一組操作執(zhí)行完成精耐。
和join方法非常類(lèi)似CountDownLatch底層是基于AQS實(shí)現(xiàn)的
工作原理
CountDownLatch countDownLatch=new CountDownLatch(2) AQS的state狀態(tài)為2处硬。
調(diào)用countDownLatch.countDown();方法的時(shí)候狀態(tài)-1 當(dāng)AQS狀態(tài)state為0的情況下,則喚醒正在等待的線(xiàn)程。
- 計(jì)數(shù)器---CountDownLatch
- new CountDownLatch(2) 需要等待的線(xiàn)程執(zhí)行數(shù)
- countDownLatch.countDown(); 子線(xiàn)程已執(zhí)行完畢
- countDownLatch.await() 等待所有線(xiàn)程執(zhí)行完畢后執(zhí)行后續(xù)的操作
CountDownLatch與Join的區(qū)別
Join底層是基于wait方法實(shí)現(xiàn)
CountDownLatch底層是基于AQS實(shí)現(xiàn)。
基于AQS手寫(xiě)CountDownLatch核心代碼
思路
a窖式、初始化AQS里的state
b、重寫(xiě)AQS里的 tryAcquireShared和tryReleaseShared方法達(dá)到線(xiàn)程的阻塞和喚醒操作
/**
* 構(gòu)造函數(shù)設(shè)置aqs的state
* @param count state值
*/
public MyCountDownLatch(int count){
// state不允許小于0
if (count < 0) {
throw new IllegalArgumentException("count < 0");
}
sync = new Sync(count);
}
/**
* 重寫(xiě)阻塞的條件,當(dāng)state不為零則阻塞
* @param acquires
* @return
*/
@Override
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
/**
* 使用自旋機(jī)制网杆,當(dāng)getState()-1后為0即喚醒
* @param releases 步長(zhǎng)筒主,正常情況均為1
* @return
*/
@Override
protected boolean tryReleaseShared(int releases) {
// 使用自旋
for (;;) {
int c = getState();
//當(dāng)state傳入的參數(shù)為0時(shí)使兔,則直接返回不用釋放鎖
if (c == 0) {
return false;
}
// 執(zhí)行完后state會(huì)減少
int nextc = c-releases;
// 利用CAS無(wú)鎖機(jī)制,判斷如果state-1為0匹涮,則喚醒其他線(xiàn)程
if (compareAndSetState(c, nextc)) {
return nextc == 0;
}
}
}
相關(guān)文章鏈接:
<<<多線(xiàn)程基礎(chǔ)
<<<線(xiàn)程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內(nèi)存模型(JMM)
<<<Volatile解決JMM的可見(jiàn)性問(wèn)題
<<<Volatile的偽共享和重排序
<<<CAS無(wú)鎖模式及ABA問(wèn)題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<Semaphore信號(hào)量
<<<CyclicBarrier屏障
<<<線(xiàn)程池
<<<并發(fā)隊(duì)列
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線(xiàn)程總結(jié)