我需要一些帮助,以了解使用CountDownLatch相对于传统的wait-notify的优势。我认为notifyAll()确实做了同样的事情,并且似乎更易于使用(可能是由于熟悉)。
另外,CountDownLatch中的wait()和await()有什么区别?
谢谢 !
编辑:我想我需要改写我的查询:
根据文档所说的Await():
对我来说,很难看到wait()和await()之间的区别-await()的确在后台使用了wait(),并且当计数达到零时似乎存在一个隐式notifyAll()。
我要问的是,为什么我不应该简单地使用wait-notifyAll()机制(使用我自己的计数器变量处理),而不是使用CountDownLatch?
最佳答案
他们当然不会做同样的事情:CountDownLatch
仅在事件计数达到0时发出信号,并且会自动计数,如果想要实现相同的行为,wait-notify
要求您保留自己的计数。实现相同的行为通常容易出错,最好避免这种情况(特别是如果您不熟悉并发编程)。比较CountDownLatch
和wait-notify
几乎不是苹果与桔子的比较,它更像是比较自动钻和内六角 Spanner 。
我不知道您是否使用过notifyAll()
和CountDownLatch
,但仅notifyAll()
不会提供相同的行为,除非您一直计算发生了多少事件。 CountDownLatch
可能最适合执行固定数量的任务,并在继续执行其余程序之前等待这些任务完成。当您有固定数量的线程(例如ThreadPool
)执行固定数量的任务时,这特别有用,但是您的线程比任务少,并且您必须重用它们。使用CountDownLatch
,您可以轻松地等待所有任务完成。我不知道您如何一直使用notifyAll()
来实现相同的行为,但是如果您向我们提供了更多信息,我们可以解决两者中的哪一个是更好的选择(当然,在某些情况下waitNotify()
更合适) 。
关于wait()
和await()
的区别,我对您有些失望!查找文档是任何问题的第一步:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.htmlawait()
是CountDownLatch
的实际功能,而wait()
继承自Object
。我建议您检查文档中的内容。