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

时间:2011-02-06 07:25:43

标签: java multithreading concurrency

据我所知,wait()notify()已被更好的并发机制所取代。那么,您可以选择哪种更好的替代方案,比如实施a synchronized queue

他们究竟是什么“更好”?

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

5 个答案:

答案 0 :(得分:21)

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

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

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

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

答案 1 :(得分:5)

java.util.concurrent包中已经存在很多实现。例如。 - ArrayBlockingQueueDelayQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueue

wait()notify()也未被替换。引入了新的实用程序,提供额外的功能和性能优势。例如,请参阅java.util.concurrent.locks包。

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

干杯。

编辑1:好的,那么例如你可以使用java.util.concurrent.locks .Lock的实现来实现一个超时的出列操作,同时为访问它的线程授予公平性队列。这种实现是ReentrantLock,它有一个接受公平政策的构造函数。定时tryLock()赞成此属性。此外,您还可以添加一些调试支持来计算队列中等待的线程等。如果我假设wait()notify(),那么实现起来要困难得多。

总之,ReentrantLock比其扩展能力中的低级对应物“更好”。但基本行为是一样的。如果您不需要这些额外内容,wait()notify()仍可接受。

答案 2 :(得分:3)

阅读ArrayBlockingQueue实现的来源揭示了使用Conditions替代对象监视器方法“wait / notify / notifyAll”。此外,使用ReentrantLock代替“synchronized”关键字来获得类似的互斥行为和语义。所以似乎java.util.concurrent.locks包是您正在寻找的。这些新接口更好,因为它们提供了原始同步和锁定构造所不具备的附加功能,例如多个等待集和选择性读取或写入锁(而不是始终读取写入)。 / p>

java.util.concurrent.atomic包还提供compare-and-swap指令的接口,这些指令对non-blocking algorithms非常有用,它们可能比阻塞替代方案快得多,但也有自己的挑战。

答案 3 :(得分:1)

在这种情况下,

lockSupport类的park()unpark()方法似乎很有用。 我也面临同样的问题,在网上搜索时,在这次讨论中找到了线索。

Synchronization vs Lock

但是我需要进一步理解创建示例应用程序的概念。

答案 4 :(得分:0)

如何在Concurrent包中使用Semaphore? 使用二进制信号量作为内部锁和两个计数信号量来设置队列大小的界限?