wait-notify和CountDownLatch之间的区别

我需要一些帮助来理解使用CountDownLatch优于传统的wait-notify的优点。 我认为notifyAll()确实做了同样的事情,它似乎更容易使用(也许是因为熟悉)。

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

谢谢 !

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

Await()根据文档说:

除非线程被中断,否则导致当前线程等待锁存器倒计数到零。

对我来说很难看出wait()和await()之间的区别 – await()确实在封面下使用了wait(),而且当count到零时似乎有一个隐式的notifyAll()。

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

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

我不知道你是否使用过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()是从Objectinheritance的。 我建议您查看文档以了解它们的用途。