什么是等待的最佳替代方案...通知低级同步?

rip*_*234 19 java concurrency multithreading

据我所知,wait()notify()已被更好的并发机制所取代.那么,您可以选择哪种更好的替代方案,比如实现同步队列

他们究竟是什么"更好"?

编辑:这("实现同步队列")是一个面试问题.可接受的答案不能使用BlockingQueue或其他队列实现.但是,它可能使用其他同步构造,例如CountDownLatch.我没有详尽的允许和禁止课程列表 - 使用你的头脑.

Jed*_*ith 21

synchronized/wait()/notify()/notifyAll()已被Lock类方法lock()/unlock()/newCondition()和Condition 直接替换await()/signal()/signalAll().

这些有几个好处,一开始允许其他语义,如公平策略,以及分布式锁定等功能.对多个Condition对象的支持允许更细粒度的信令以及不间断的等待和等待直到某个时间等.

例如,链接代码具有它尝试用于信令的单独对象(由于在等待时不保持相关监视器的事实,该对象将失败).这可以通过使用具有多个条件的单个锁直接替换.

就改进而言,附加功能可能是有价值的.在Java5中,显式的Lock实现实际上比JVM监视器表现得更好,但它们基本上标记了Doug Lea的JVM代码,现在性能大致相当.


Lac*_*lev 5

java.util.concurrent包中已经存在很多实现.EG - , ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,.PriorityBlockingQueueSynchronousQueue

wait()notify()不补.引入了新的实用程序,提供额外的功能和性能优势.例如,参见java.util.concurrent.locks包.

我建议你阅读这篇介绍.它提供了一个高概述,可以回答您的问题.

干杯.

编辑1:好的,那么例如你可以使用一个实现java.util.concurrent.locks .Lock来实现一个超时的出列操作,同时为访问队列的线程授予公平性.这种实现ReentrantLock具有接受公平策略的构造函数.时间tryLock()有利于这个属性.您还可以添加一些调试支持来计算队列中的等待线程等.这将简单地实现wait()并且notify()我假设更难.

总的来说ReentrantLock,它的扩展能力比低水平的同行"更好".但基本行为是一样的.如果你不需要这些额外的东西wait(),notify()仍然可以接受.