等待期间Java线程的状态是什么,无法获取锁定
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了等待期间Java线程的状态是什么,无法获取锁定,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1579字,纯文字阅读大概需要3分钟。
内容图文
![等待期间Java线程的状态是什么,无法获取锁定](/upload/InfoBanner/zyjiaocheng/796/217c1bb4c2784500894335b6bcbd97c1.jpg)
Java线程可以通过以下任一方式保存:
>无法获得锁定.
>由wait()方法持有.
根据Java线程状态,上述两种场景有什么区别?
请考虑以下简单代码:
synchronized(object) {
object.wait();
System.out.println("Completed.");
}
如果两个线程(比如ThreadA和ThreadB)都被保存在wait()方法中.当另一个线程调用notifyAll()时,ThreadA将从等待中恢复并获取对象的锁定并继续,例如. ThreadB也将恢复但无法获取对象的锁定并保持直到ThreadA退出synchronized块.然后ThreadB获得锁定并继续.
结果将打印两个“已完成”.
在这个例子中,必须有一段时间ThreadB从“被wait()持有”变为“被持有,因为它无法获得对象的锁定”.
我想知道它在Java内部是如何工作的.请帮忙.
解决方法:
在object.wait()状态和等待对象监视器上的锁之间的区别在于object.wait()状态中的线程释放它所拥有的对象的所有监视器,并且它将与所有线程竞争系统再次重新获取监视器.这使得wait()成为一种特殊状态.
所以在你的情况下,当A和B(线程A和线程B)处于等待状态时,它们没有同步对象的监视器,它们都被暂停执行,直到其他一些线程调用object.notify()或object.notifyAll().调用notifyAll()时,JVM会唤醒object.wait()状态下的所有线程(在本例中为A和B),并且它们竞争获取当前同步块的监视器.如果调用notify(),则JVM随机选择A或B.
这里要注意的是,JVM没有通知任何特定的线程,这就是为什么每个等待的线程都必须等待一段时间(notify_condition_for_me)循环,该循环验证等待条件是否已经存在,如果不是它必须进入object.wait ()再次声明.
所以正确的代码应该是
synchronized(object) {
while(myResourceArrived) {//like URL data, JDBC data or something
object.wait();
}
System.out.println("Completed.");
}
当A和B处于object.wait()状态时,它们释放了它们先前为对象保存的所有监视器,因此在synchronized块外等待的任何其他线程将立即通过获取释放的监视器来进入块.宾语.
内容总结
以上是互联网集市为您收集整理的等待期间Java线程的状态是什么,无法获取锁定全部内容,希望文章能够帮你解决等待期间Java线程的状态是什么,无法获取锁定所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。