Jag*_*uar 6 java concurrency synchronization
我需要一些帮助来理解使用CountDownLatch优于传统的wait-notify的优点.我认为notifyAll()确实做了同样的事情,它似乎更容易使用(也许是因为熟悉).
另外,来自CountDownLatch的wait()和await()有什么区别?
谢谢 !
编辑:我想我需要改写我的查询:
Await()根据文档说:
除非线程被中断,否则导致当前线程等待锁存器倒计数到零.
对我来说很难看出wait()和await()之间的区别 - await()确实在封面下使用了wait(),而且当count到零时似乎有一个隐式的notifyAll().
我的意思是,为什么我不应该简单地使用wait-notifyAll()机制(使用我自己的计数器变量处理),而不是去CountDownLatch?
它们当然不会做同样的事情:CountDownLatch
只有在事件计数达到0时才会发出信号并且它会自动执行,wait-notify
如果您想要实现相同的行为,则需要保留自己的计数.实现相同的行为通常容易出错,最好避免它(特别是如果您不熟悉并发编程).比较CountDownLatch
和wait-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
.我建议您查看文档以了解它们的用途.