CountDownLatch
CountDownLatch初始化一個state,
調用await方法,如果state=0,那麼獲得鎖,如果state>0,那麼加入到等待隊列
調用countDown方法,自旋cas做state-1操作,如果state=0,喚醒等待隊列次頭節點,同時自旋喚醒,被喚醒的線程把次頭節點設置為頭節點,在喚醒次頭節點的線程。由於把次頭節點設置為頭節點這個操作和喚醒次頭節點的操作不是原子操作,所以次頭節點設置為頭節點操作結束,其他還在自旋喚醒的線程,也有可能喚醒這個節點,此時會加速等待隊列的喚醒操作,直至所有的節點喚醒完畢。
執行過程