一尘不染

等待通知和CountDownLatch之间的区别

java

我需要一些帮助,以了解使用CountDownLatch与传统的wait-
notify相比的优势。我认为notifyAll()确实做了同样的事情,并且似乎更易于使用(可能是由于熟悉)。

另外,CountDownLatch中的wait()和await()有什么区别?

谢谢 !

编辑:我想我需要改写我的查询:

Await()根据文档说:

使当前线程 等待, 直到锁存器递减计数到零为止,除非该线程被中断。

对我来说,很难看到wait()和await()之间的区别-
await()的确在掩护下使用了wait(),并且当计数达到零时,似乎存在一个隐式notifyAll()。

我要问的是,为什么我不应该简单地使用wait-notifyAll()机制(使用我自己的计数器变量处理),而不是使用CountDownLatch?


阅读 260

收藏
2020-12-03

共1个答案

一尘不染

他们当然不会做同样的事情:CountDownLatch仅在事件计数达到0时发出信号,并且会自动wait- notify计数,如果您想要实现相同的行为,则需要保留自己的计数。实现相同的行为通常容易出错,最好避免这种情况(尤其是如果您不熟悉并发编程)。比较CountDownLatchwait- notify很难甚至是拿苹果和橘子相比,它更像是一个比较自动挖掘和内六角扳手。

我不知道您是否曾经使用过notifyAll()CountDownLatch,但notifyAll()除非您一直记下发生了多少事件,否则单独不会给您相同的行为。CountDownLatch最适合执行固定数量的任务并等待这些任务完成,然后再继续执行其余程序。当您有固定数量的线程(例如ThreadPool)执行固定数量的任务时,它特别有用,但是您的线程比任务少,您必须重用它们。使用a,CountDownLatch您可以轻松地等待所有任务完成。我不知道您如何一直使用notifyAll()以实现相同的行为,waitNotify()
更合适)。

对于之间的区别wait()await(),我有点失望了!查找文档是任何问题的第一步:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

await()是的实函数,CountDownLatch而是wait()从继承的Object。我建议您检查文档中的内容。

2020-12-03