多线程之CountDownLatch详解

(29) 2024-02-11 18:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说多线程之CountDownLatch详解,希望能够帮助你!!!。

上篇我们介绍了一下重入锁ReentrantLock,这篇我们详细的介绍CountDownLatch。

CountDownLatch是什么?

CountDownLatch是juc包下的一个同步工具类,它允许一个或多个线程等待,直到在其他线程中一组操作执行完成的同步辅助工具。它是AQS多线程同步操作的一个具体实现。

CountDownLatch源码

CountDownLatch还是比较简单的,我们直接看一下它源码,如下所示:

多线程之CountDownLatch详解_https://bianchenghao6.com/blog__第1张

第一个是构造方法,我们就不写了,其他方法看如下列表即可。

多线程之CountDownLatch详解_https://bianchenghao6.com/blog__第2张

从CountDownLatch的方法看还是很简单,最关键就两个方法:

1、countDown,每次锁存器计数减1

2、await,等到锁存器计数为零之前,除非线程为interrupted ,否则指定的等待时间过去,会阻塞当前线程执行后续操作。

CountDownLatch应用demo

我们实现一个非常简单的例子,默认多个线程并发操作,执行某个任务,主线程等待所有线程操作完成之后,再继续主线程的后续任务。

多线程之CountDownLatch详解_https://bianchenghao6.com/blog__第3张

执行过程如下图所示:

多线程之CountDownLatch详解_https://bianchenghao6.com/blog__第4张

总结一下:

1、CountDownLatch countDownLatch = new CountDownLatch(N); //构造对象时候 需要传入参数N

2、countDownLatch.await() 能够阻塞线程,直到调用N次countDownLatch.countDown() 方法,计数减为0才释放线程。

3、countDownLatch.countDown() 可以在多个线程中调用 计算调用次数是所有线程调用次数的总和。

注意:

1、CountDownLatch是一个一次性的现象,计数无法重置。如果需要重置计数,请考虑使用CyclicBarrier,下篇博文(多线程之CyclicBarrier详解)

2、CountDownLatch构造方法传入的计数,必须跟子线程数一样,否则倒记数的值不为0,进入持续等待中,并没有唤醒主线程来执行或者子线程还没有全部执行结束,主线程已经执行完毕,没有达到同步的目的,所以countDownLatch.await()生效必须保证计数值变为0。

欢迎大家评论,收藏+转发,谢谢。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复