wait-notify和CountDownLatch之间的区别

时间:2012-05-15 04:06:18

标签: java concurrency synchronization

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

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

谢谢!

编辑:我想我需要重新解释一下我的问题:

Await()根据文档说:

  

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

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

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

1 个答案:

答案 0 :(得分:9)

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

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

关于waitNotify()wait()之间的区别,我对你有些失望!查阅文档是任何问题的第一步:

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

await()await()的实际函数,而CountDownLatchwait()的继承。我建议您查看文档以了解它们的用途。