countDownLatch可以實(shí)現(xiàn)一個(gè)線程或者一些線程需要等待其他線程的任務(wù)完成之后才做任務(wù)诅病。需要等待執(zhí)行的線程內(nèi)調(diào)用await()等待其他線程執(zhí)行完喳张,而被等待的線程內(nèi)調(diào)用countDown()表示當(dāng)前線程任務(wù)執(zhí)行完成了辆沦,當(dāng)所有的被等待線程都執(zhí)行完成之后,等待線程繼續(xù)執(zhí)行任務(wù)。
實(shí)現(xiàn)
countDownLatch內(nèi)部類Sync繼承了AQS蕾羊,對(duì)其中關(guān)于共享鎖的獲取進(jìn)行了實(shí)現(xiàn)侮叮。將state當(dāng)作是需要等待的線程數(shù)避矢,通過共享鎖來實(shí)現(xiàn)對(duì)多個(gè)線程的控制。
使用場景
1囊榜、多線程執(zhí)行完后的匯總操作审胸。匯總線程執(zhí)行await,多線程任務(wù)執(zhí)行countDown卸勺。
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {// count用于限制被等待線程數(shù)
setState(count);
}
int getCount() {
return getState();
}
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;//當(dāng)state為0時(shí)砂沛,允許獲取鎖,表示此時(shí)被等待的線程數(shù)為0
}
protected boolean tryReleaseShared(int releases) {//當(dāng)被等待的線程數(shù)完成任務(wù)之后觸發(fā)曙求,表示被等待線程執(zhí)行完成碍庵,調(diào)用countDown時(shí)調(diào)用
// Decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
countDownLatch通過調(diào)用Sync的具體方法來實(shí)現(xiàn)await和countDown方法的邏輯映企。
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
public void countDown() {
sync.releaseShared(1);
}
AQS設(shè)計(jì)用來作為實(shí)現(xiàn)同步器的工具,讓我們不需要關(guān)注其內(nèi)部是怎么實(shí)現(xiàn)線程等待和線程恢復(fù)競爭鎖静浴。我們只需要實(shí)現(xiàn)獲取鎖的方式是什么卑吭。對(duì)于state不一定是狀態(tài)的意思,在這里countDownLatch將state作為被等待線程數(shù)使用马绝,在其他地方也可以賦予其他含義豆赏。