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线程,让他开始往下去执行,不要继续阻塞了

 

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