当前位置: 首页 > 面试题库 >

等待等待的最佳选择是什么……通知低级同步?

房冥夜
2023-03-14
问题内容

据我所知,wait()notify()已替换为更好的并发机制。那么,对于实现同步队列,您会选择哪种更好的替代方法呢?

它们究竟在什么意义上“更好”?

编辑
:这(“实现同步队列”)是一个采访问题。可接受的答案不能使用BlockingQueue或其他队列实现。但是,它可能使用其他同步构造,例如CountDownLatch。我没有允许和禁止的类的详尽列表-
请您注意。


问题答案:

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

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

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

在改进方面,附加功能可能很有价值。在Java5中,显式的Lock实现实际上比JVM监视器执行得更好,但是它们基本上为Doug
Lea的JVM刻上了代码,并且性能现在大致相当。



 类似资料:
  • 问题内容: 如果我仅使用同步而不是等待/通知方法,它将仍然保持线程安全吗? 有什么不同 ? 提前谢谢。 问题答案: 使用使方法/块一次只能在线程上访问。因此,是的,它是线程安全的。 这两个概念是结合在一起的,而不是相互排斥的。使用时,您需要在该对象上拥有监视器。所以您需要在此之前。使用使当前线程停止,直到另一个线程在其等待的对象上调用。这是对的补充,它仅确保仅一个线程将进入块/方法。

  • 我第一次在NIFI1.2中试用wait\notify处理器。在分布式缓存服务的属性中,我选择创建新服务。在该服务的属性下,我只选择运行nifi的本地服务器的主机名作为服务器主机名,所有的灯都在GO上改变。 但是当我开始使用Prozessors时,我遇到了这样一个错误:

  • 我不完全理解和()是如何工作的,因此我不得不将尝试缩减到以下代码部分。 main.java: runner.java: 当前,我在调用时得到一个非法MonitorStateException,但我不明白为什么。从我所看到的情况来看,我需要同步,但在这样做的时候,我假设它只会通知一个线程,而我的想法是通知所有线程。 我已经查看了,但是我找不到合适的替换(也许我只是遗漏了一些东西)。

  • 我正在努力学习如何正确使用async Wait,但我对它有点共同的想法。 在片段中,我试图构建一个对象数组,其中包含我需要的关于我在组件中上传的文件的信息。问题是this.fileInfo中的对象并没有完全等待返回编码图像的promise,而是在我console.logthis.fileInfo时返回此输出: 如您所见,关键图像是一个值未定义的ZoneAwarePromise。你能帮我修一下吗?

  • 我需要修改一个现有的程序,它包含以下代码: 但这在我看来非常奇怪,首先是在select中使用和。根据斯蒂芬·克利里的回答,我应该能够放弃这些。 然后第二个,它选择结果。这是不是意味着任务根本不是异步的,而是同步执行的(这么多的努力是徒劳无功的),或者任务是异步执行的,当它完成后,查询的其余部分将被执行? 我是否应该按照Stephen Cleary的另一个答案,像下面这样编写上述代码: 而且像这样完

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似