CountDownLatch的概念
CountDownLatch是一個同步工具類,用來協調多個線程之間的同步,或者提及到線程之間的通訊(而不是用做互斥的做用)。併發
CountDownLatch可以使一個線程在等待另一些線程完成各自工做以後,再繼續執行。使用一個計數器進行實現。計數器初始值爲線程的數量。當每個線程完成本身任務後,計數器的值就會減一。當計數器的值爲0時,表示全部的線程都已經完成了任務,而後在CountDownLatch上等待的線程就能夠恢復執行任務。工具
CountDownLatch的用法
CountDownLatch典型用法1:某一線程在開始運行前等待n個線程執行完畢。將CountDownLatch的計數器初始化爲n new CountDownLatch(n) ,每當一個任務線程執行完畢,就將計數器減1 countdownlatch.countDown(),當計數器的值變爲0時,在CountDownLatch上 await() 的線程就會被喚醒。一個典型應用場景就是啓動一個服務時,主線程須要等待多個組件加載完畢,以後再繼續執行。spa
CountDownLatch典型用法2:實現多個線程開始執行任務的最大並行性。注意是並行性,不是併發,強調的是多個線程在某一時刻同時開始執行。相似於賽跑,將多個線程放到起點,等待發令槍響,而後同時開跑。作法是初始化一個共享的CountDownLatch(1),將其計數器初始化爲1,多個線程在開始執行任務前首先 coundownlatch.await(),當主線程調用 countDown() 時,計數器變爲0,多個線程同時被喚醒。 線程
線程在執行yield()之後,持有的鎖是不釋放的同步
sleep()方法被調用之後,持有的鎖是不釋放的it
調動方法以前,必需要持有鎖(否則 程序會拋出異常),調用了wait()方法之後,鎖就會被釋放,當wait方法返回的時候,線程會從新持有鎖yield
調動方法以前,必需要持有鎖(否則 程序會拋出異常),調用notify()方法自己不會釋放鎖的程序