7

我需要一些帮助来了解使用 CountDownLatch 相对于传统等待通知的优势。我认为 notifyAll() 确实做同样的事情,而且似乎更容易使用(可能是因为熟悉)。

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

谢谢 !

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

Await() 根据文档说:

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

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

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

4

1 回答 1

11

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

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

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

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

await()是 while 的实际函数,CountDownLatch继承wait()Object. 我建议您检查文档以了解他们的工作。

于 2012-05-15T04:17:45.450 回答