,Java提供了一些非常好用的并发工具类,不需要我们重复造轮子,本节我们讲解CountDownLatch,一起来看下吧!,首先我们来看下这玩意是干啥用的。CountDownLatch同样的也是java.util.concurrent并发包下的工具类,通常我们会叫它是并发计数器,这个计数不是记12345,主要的使用场景是当一个任务被拆分成多个子任务时,需要等待子任务全部完成后,不然会阻塞线程,每完成一个任务计数器会-1,直到没有。这个有点类似go语言中的的sync.WaitGroup。,废话不多说,我们通过例子带大家快速入门, 在这之前,还需给大家补充一下它的常用方法:,下面我们看下具体的使用:,时间输出:,可以看到任务没有完全结束之前,主线程是阻塞状态。,首先看下构造函数。,这个sync有没有很熟悉,这里又遇到了CAS,几乎涉及到多线程的实现类都会有。,首先在构造函数中初始化状态,对应的setState(count);, 其实它的底层实现就是依赖AQS。CountDownLatch主要有两个方法一个是countDown一个是await,下面我们就来看下是如何实现的。,tryReleaseShared()方法的实现在countDownLatch,自旋操作判断值是否为0,为0说明都执行完了,之前说的递减就是在这完成的,就会走到doReleaseShared也就是释放操作。有想过为啥c==0 返回false吗可以回顾上一步操作if (tryReleaseShared)才会去doReleaseShared,也就是任务全部执行完才会去释放,释放的过程其实是一个队列去完成的。,doReleaseShared是`AbstractQueuedSynchronizer'的内部方法。,这个方法之前给大家讲过,其实就是释放锁的操作。可以看到在这里只唤醒了头节点的后继节点,然后就返回了,为啥是后继节点,继续看unparkSuccessor。,那么剩余的其它线程怎么去释放呢?,再看下await(),同样的也调用了内部方法acquireSharedInterruptibly。,重点在 doAcquireSharedInterruptibly。
© 版权声明
文章版权归作者所有,未经允许请勿转载。