【发布时间】:2019-05-16 06:53:44
【问题描述】:
Java 线程 A 未能执行同步语句,因为另一个线程已获得监视器。
线程A被JVM排队?
以及之后如何通过 1) 或 2) 激活线程 A?
- 一旦监视器被释放,JVM 就会发出这个信号,线程 A 可能会被激活
- JVM会在一段时间内检测monitor是否可用,如果monitor可用,则可能会激活线程A
【问题讨论】:
-
会发生什么:线程被阻塞,将停止而不继续。这有点像排队,但取决于操作系统和使用的线程库。#2 最接近;当一个线程被解除阻塞时,它被放入就绪队列(就绪=能够运行),但如果操作系统有其他线程/进程正在运行并且仍然能够继续,它可能不会立即运行。
-
一个附录:上次我检查过,JVM 可以优化一个很少被竞争(很少被阻塞)的同步块,并将同步检查变成一个自旋锁。这些不会排队,它们只会消耗 CPU 周期,直到锁被释放。
-
"fails to execute"你可能想用'failed'来限定你的意思,因为它不会失败,它只是等到它可以继续。跨度>
-
是的,完美的答案@markspace我主要是困惑是否因为'同步'语句而阻塞的线程是由monior释放动作通知的,比如因为'等待'语句而阻塞的线程是由
notify语句告知 -
我的意思是“执行失败”是被阻止直到可以得到监视器@MarkRotteveel
标签: java multithreading