CountDownLatch源碼剖析

簡介

如果你的一個線程啓動了多個線程來執行一些任務,此時你的這個線程需要同步阻塞等待那些線程都執行完畢了,纔可以繼續往下走,此時可以用CountDownLatch

剖析源碼

countDownLatch.await():觸發了一個線程入隊阻塞等待

它會調用tryAcquireShared()

        protected int tryAcquireShared(int acquires) {

            return (getState() == 0) ? 1 : -1;

        }

剛開始的時候,state = 2,此時調用這個方法,state != 0,所以會返回-1。此時會將當前線程封裝爲一個node放入AQS的等待隊列中,入隊去等待。調用LockSupport.park()操作,掛起main線程,不能幹任何事情了,就等待別人把他從隊列裏來喚醒

 countDown():如果state == 0,喚醒隊列裏等待的所有的線程。所有線程被喚醒,發現state == 0,就從await()方法裏退出

其實就是把AQS的state給減1,走CAS來設置state的值;如果CAS成功了,就看看當前的state的值是不是0,如果是0就返回true,如果不是0,就返回false

第一個線程把state - 1,此時state = 1,此時這個返回的是false,相當於別的什麼都不幹了,就是僅僅把state的值給減1就可以了

如果是第二個線程再次來coutnDown操作,state = 0,如果此時state是0的話,就會觸發一段邏輯,肯定會從AQS的等待隊列中,喚醒之前等待的main線程,讓他開始往下去執行,不要繼續阻塞了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章