工作中的某个人只是问了要在同步对象中包装等待的原因。
老实说,我看不出推理的原因。我了解javadocs所说的内容-
该线程需要成为对象监视器的所有者,但是为什么呢?它可以防止什么问题?(如果确实有必要,为什么wait方法不能获取监视器本身?)
我正在寻找一个相当深入的原因,或者可能是一篇文章的参考。我无法在快速的Google中找到一个。
哦,还有,thread.sleep比较起来如何?
编辑:非常好的答案-我真的希望我可以选择多个答案,因为它们都帮助我了解发生了什么。
如果对象在调用Object.wait()时不拥有对象监视器,则在释放监视器之前,它将无法访问该对象以设置通知侦听器。而是将其视为尝试访问同步对象上的方法的线程。
或者换句话说,两者之间没有区别:
public void doStuffOnThisObject()
和以下方法:
public void wait()
在释放对象监视器之前,这两种方法都将被阻止。这是Java中的一项功能,可防止一个以上的线程更新对象的状态。它只是对wait()方法产生了意想不到的后果。
大概,wait()方法未同步,因为这可能会导致Thread在对象上具有多个锁的情况。(有关此信息,请参阅Java语言规范/锁定。)多个锁是一个问题,因为wait()方法只会撤消一个锁。如果该方法是同步的,则可以确保仅撤消该方法的锁,同时仍保留潜在的外部锁。这将在代码中创建死锁条件。
要回答有关Thread.sleep()的问题,Thread.sleep()不保证您正在等待的任何条件都得到满足。使用Object.wait()和Object.notify()允许程序员手动实现阻塞。发送通知已满足条件后,线程将解除阻塞。例如,从磁盘的读取已完成,并且线程可以处理数据。Thread.sleep()将要求程序员轮询是否已满足条件,如果不满足则返回睡眠状态。
问题内容: 我无法理解网页的的文档中。 谁能简单地向我解释一下? 问题答案: 背后的想法是它将转换您的数据,使其分布的平均值为0,标准差为1。 对于多变量数据,这是按功能进行的(换句话说,独立于数据的每一列) 。 给定数据的分布,数据集中的每个值都将减去平均值,然后除以整个数据集(或多变量情况下的特征)的标准差。
Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。
问题内容: 对于Java对象,有没有办法告诉哪个线程(或null)当前 拥有其监视器?或者至少是一种方法来判断当前线程是否拥有它? 问题答案: 我自己找到了一些答案。要测试当前线程是否拥有 监视器,是否 存在! exists! 这确实非常快(亚微秒),并且从1.4开始就可用。 通常,要测试哪个线程(或线程ID)持有该锁,可以 对 classes (thanks @amicngh). 有一些注意事项
我正在尝试实现线程,其中一个线程生成随机数,而另一个线程等待,一旦它生成随机数,它应该通知并等待另一个线程也这样做。我收到了非法的监控状态异常,请帮我指出我的错误。
我们正在对使用SpringBoot 2.2.2和Spring执行器的应用程序进行性能测试。 我们希望监控: 正在使用多少tomcat线程 有多少tomcat请求正在排队 正在使用多少个ThreadPoolTaskExector线程(我们将@Async与线程池一起用于某些任务) 执行器中是否提供此信息?我看不到需要使用哪些指标。
这是我从骡子3到骡子4转换的第一个项目。我与mule4一起工作,但在Mule3是新的。有谁能帮帮我吗?你能告诉我这些自定义处理器和变压器在这个mule3代码中的用途吗?而Mule4中的等价代码会是什么呢?在骡子4中没有像这样的自定义变压器。请帮帮我..