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

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

谢谢 !

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

根据文档所说的Await():



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

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

最佳答案

他们当然不会做同样的事情:CountDownLatch仅在事件计数达到0时发出信号,并且会自动计数,如果想要实现相同的行为,wait-notify要求您保留自己的计数。实现相同的行为通常容易出错,最好避免这种情况(特别是如果您不熟悉并发编程)。比较CountDownLatchwait-notify几乎不是苹果与桔子的比较,它更像是比较自动钻和内六角 Spanner 。

我不知道您是否使用过notifyAll()CountDownLatch,但仅notifyAll()不会提供相同的行为,除非您一直计算发生了多少事件。 CountDownLatch可能最适合执行固定数量的任务,并在继续执行其余程序之前等待这些任务完成。当您有固定数量的线程(例如ThreadPool)执行固定数量的任务时,这特别有用,但是您的线程比任务少,并且您必须重用它们。使用CountDownLatch,您可以轻松地等待所有任务完成。我不知道您如何一直使用notifyAll()来实现相同的行为,但是如果您向我们提供了更多信息,我们可以解决两者中的哪一个是更好的选择(当然,在某些情况下waitNotify()更合适) 。

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

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
await()CountDownLatch的实际功能,而wait()继承自Object。我建议您检查文档中的内容。

10-08 15:09