等待和无法获取锁定期间Java线程的状态是什么

凯文

Java线程可以由以下任何一种持有:

  1. 无法获取锁。
  2. 由wait()方法持有。

就Java线程状态而言,以上两种方案之间有什么区别?

考虑以下简单代码:

   synchronized(object) {
       object.wait();
       System.out.println("Completed.");
   }

如果两个线程(例如ThreadA和ThreadB)都被保留在wait()方法中。例如,当另一个线程调用notifyAll()时,ThreadA将从等待中恢复并获得对对象的锁定并继续。ThreadB也将恢复,但无法获得对象上的锁定,并一直保持到ThreadA退出同步块为止。然后,线程B获得锁并继续。

结果将两个“ Completed”打印出来。

在此示例中,必须有一段时间ThreadB从“由wait()保持”变为“由于无法获取对象的锁而被保持”。

我想知道它在Java内部如何工作。请帮忙。

11维

处于object.wait()状态与等待监视器的锁定之间的区别object是,处于该object.wait()状态的线程将释放object它所持有的所有监视器,并且它将与系统中的所有线程竞争以再次重新获取监视器。那是wait()一种特殊的状态。

因此,在您的情况下,当Aand B(线程A和线程B)处于等待状态时,它们没有用于监视的监视器object,它们都已被暂停执行,直到其他线程调用object.notify()为止object.notifyAll()notifyAll()被称为JVM唤醒所有线程(在这种情况下A,并B在)object.wait()的状态和他们竞争来获得当前的监视器synchronized块。如果notify()被调用,那么JVM会随机选择A或B。

这里要注意的是,JVM没有通知任何特定的线程,这就是每个等待线程都必须在while(notify_condition_for_me)循环中等待的原因,该循环验证是否已经达到了等待条件(如果不是),则必须object.wait()再次进入该状态。

所以正确的代码应该是

synchronized(object) {
   while(myResourceArrived) {//like URL data, JDBC data or something
       object.wait();
   }
   System.out.println("Completed.");
}

AB处于object.wait()状态时,它们已经释放了先前保留的所有监视器object,因此,在synchronized外部等待的任何其他线程都可以通过获取释放的Monitor来立即进入该块object

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

等待完成Completable future线程完成的建议方法是什么

Java线程状态转换,正在等待阻塞还是在RUNNABLE?

Java线程转储:“等待锁定”与“停放等待”之间的区别?

Java JVM分析,线程状态-“监视”状态是什么意思?

同步线程和锁定

停止线程等待网络活动的正确方法是什么?

Java中线程的等待和通知序列

等待锁定已锁定对象的Java线程

线程状态被阻止和等待之间的区别

Java线程等待和通知方法

导致C ++ 11 std :: mutex将阻塞的线程锁定为被动等待状态?

实际以异步/等待模式“多线程”执行的代码是什么?

Java线程的状态到底是什么意思?

在非活动状态下在Android应用中等待之前对象未被线程锁定

线程和锁定资源

Android-应用处于锁定状态或睡眠状态时,计时器未按定期间隔运行

从日期间隔获取总的等待时间和行数

等待线程的最佳方法是什么?

在返修期间,StreamThreads的状态是什么?

“锁定”应用程序的UI线程是什么意思?

通过同步锁定由最短的等待线程获取

等待状态下的线程对Java进程中的内存的影响

Java-获取线程状态

Dalvik线程状态是什么?

tmux:(尝试)按Ctrl-B Z时我定期锁定的模式是什么

在 Java 中创建等待线程的 main() 循环的黄金标准是什么

拥有状态和使用函数获取状态之间的性能差异是什么?

如何定期使用多线程获取服务器状态

Java线程有“join()”等待所有线程,那么我们需要CyclicBarrier的用例是什么?