wait-notify和CountDownLatch之间的区别

Jag*_*uar 6 java concurrency synchronization

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

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

谢谢 !

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

Await()根据文档说:

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

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

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

Kir*_*ril 9

它们当然不会做同样的事情:CountDownLatch只有在事件计数达到0时才会发出信号并且它会自动执行,wait-notify如果您想要实现相同的行为,则需要保留自己的计数.实现相同的行为通常容易出错,最好避免它(特别是如果您不熟悉并发编程).比较CountDownLatchwait-notify很难甚至是拿苹果和橘子相比,它更像是一个比较自动挖掘和内六角扳手.

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

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

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

await()是的实际功能CountDownLatch,而wait()从继承Object.我建议您查看文档以了解它们的用途.