what happens when java thread fails to execute synchronized statement?
当另一线程获得监视器时,Java线程A无法执行同步语句。< BR>线程A由JVM排队?< BR>线程A是如何在1)或2之后被激活的?
一旦监视器被释放,JVM就会发送这个信号,线程A就会被激活。
JVM将检测监视器是否在一段时间内可用,如果监视器可用,线程A可能会被激活。
- 会发生什么:线程被阻塞,将停止并不继续。这有点像排队,但取决于操作系统和使用的线程库。#2是最接近的;当一个线程被取消阻塞时,它被放入就绪队列(ready=able to run),但如果操作系统有其他正在运行且仍能继续运行的线程/进程,它可能不会立即运行。
- 一个附录:上次我检查过,JVM可以优化一个很少有争议(很少被阻塞)的同步块,并将同步检查转换为旋转锁。它们不排队,只是在释放锁之前消耗CPU周期。
- "未能执行"您可能希望用"失败"来限定您的意思,因为它不会失败,它只是等待它可以继续。
- 是的,完美答案@markspace我主要搞不清是不是因为'synchronized'语句而被阻塞的线程被monitor释放动作通知了,就像是因为'wait'语句而被阻塞的线程被notify语句通知了一样。
- 我所说的"无法执行"是指它被阻止,直到可以获得监视器@markrottevel
- 所以你的问题实际上是关于notify?notify唤醒一个线程。如果有多个线程被阻塞,它可能是线程A,也可能不是线程A。如果在调用notify时线程A实际上没有被阻塞,也可能会"错过"通知。既然你的问题结束了,你可能会想再问一次,如果你感兴趣的话,就更强调notify。
Java语言规范在第17.1节系统中表示:
[...] Only one thread at a time may hold a lock on a monitor. Any
other threads attempting to lock that monitor are blocked until they
can obtain a lock on that monitor. [...]