CountDownLatch:允許一個或多個線程等待直到在其他線程中執(zhí)行的一組操作完成的同步輔助当编。
構(gòu)造函數(shù):
CountDownLatch(int count)
構(gòu)造一個以給定計數(shù)CountDownLatch责静。
CyclicBarrier:允許一組線程全部等待彼此達到共同屏障點的同步輔助蜒秤。
構(gòu)造函數(shù):
CyclicBarrier(int parties)
創(chuàng)建一個新的 CyclicBarrier
叛溢,當給定數(shù)量的線程(線程)等待它時奸远,它將跳閘万俗,并且當屏障跳閘時不執(zhí)行預(yù)定義的動作璃吧。
CyclicBarrier(int parties, Runnable barrierAction)
創(chuàng)建一個新的 CyclicBarrier
词疼,當給定數(shù)量的線程(線程)等待時俯树,它將跳閘,當屏障跳閘時執(zhí)行給定的屏障動作贰盗,由最后一個進入屏障的線程執(zhí)行许饿。
區(qū)別:
1、
CountDownLatch:使用給定的“計數(shù)”初始化舵盈。await方法阻塞陋率,直到由于countDown()方法的 調(diào)用而導(dǎo)致當前計數(shù)達到零,之后所有等待線程被釋放秽晚,并且任何后續(xù)的await調(diào)用立即返回瓦糟。 這是一個一次性的現(xiàn)象 - 計數(shù)無法重置。
CyclicBarrier:被稱為循環(huán) 赴蝇,因為它可以在等待的線程被釋放之后重新使用菩浙,例如如:如果初始化參數(shù)為3,那么第4個線程使用await后,會繼續(xù)阻塞劲蜻,直到再有兩個線程調(diào)用await方法后返回陆淀。
2、
CountDownLatch:線程在await過程中先嬉,等待的是“操作”(countDown)轧苫,等待指定個數(shù)的countDown,無論該操作是由哪個線程觸發(fā)疫蔓。
CyclicBarrier:線程在await過程中含懊,等待的“線程”(await),等待指定個數(shù)的線程await鳄袍。
即:CountDownLatch - > NumberOfCalls
CyclicBarrier - > NumberOfThreads
3绢要、CyclicBarrier對失敗的同步嘗試使用all-or-none斷裂模型:如果線程由于中斷,故障或超時而過早離開障礙點拗小,那么在該障礙點等待的所有其他線程也將通過BrokenBarrierException或InterruptedException異常離開重罪。
參考:
1、http://www.matools.com/api/java8
2哀九、https://stackoverflow.com/questions/4168772/java-concurrency-countdown-latch-vs-cyclic-barrier