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

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

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

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

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

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

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

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

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

还没有替换wait()notify() 。 引入了新的实用程序,提供额外的function和性能优势。 请参阅java.util.concurrent.locks包。

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

干杯。

编辑1:好的,然后例如你可以使用java.util.concurrent.locks .Lock的实现来实现一个超时的出列操作,同时为访问队列的线程赋予公平性。 这种实现是ReentrantLock ,它有一个接受公平策略的构造函数。 定时tryLock()支持此属性。 您还可以添加一些调试支持来计算队列中的等待线程等。这将简单地使用wait()notify()来实现。

总之, ReentrantLock在其扩展function方面比低级别对手“更好”。 但基本行为是一样的。 如果你不需要这些额外的东西, wait()notify()仍然是可以接受的选择。

读取ArrayBlockingQueue实现的源代码会显示使用Conditions作为Object监视器方法“wait / notify / notifyAll”的替代。 此外,使用ReentrantLock代替“synchronized”关键字来获得类似的互斥行为和语义。 所以看起来java.util.concurrent.locks包就是你要找的东西。 这些新接口更好,因为它们提供了原始同步和锁定结构所不具备的附加function,例如多个等待集和选择性读取或写入锁(而不是始终读取写入)。

java.util.concurrent.atomic包还提供了比较和交换指令的接口,这些指令对于非阻塞算法非常有用,这些算法可能比阻塞算法快得多,但也有自己的挑战。

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

同步与锁定

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

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