在Java中,当线程进入同步块/方法时会发生什么

在Java中,当线程进入同步块/方法时会发生什么,java,multithreading,synchronized,Java,Multithreading,Synchronized,我很好奇当我的线程到达一个同步块并阻塞监视器时,下面会发生什么 它是否真的在尝试使用此监视器的所有其他线程上隐式调用wait()?或者监视器有一些正在更改的特定标志 还有,当我们离开同步块时会发生什么?它是否会以某种方式为当前监视器调用notify或notifyAll 我真的很纠结于此。我认为最好从底层同步原语的角度来考虑:java监视器是一个互斥体,同步块是一个互斥体锁定在{上、解锁在}上并等待的区域,notify和notifyAll是对与互斥体关联的条件变量调用的方法 需要记住的重要一点是,

我很好奇当我的线程到达一个同步块并阻塞监视器时,下面会发生什么

它是否真的在尝试使用此监视器的所有其他线程上隐式调用wait()?或者监视器有一些正在更改的特定标志

还有,当我们离开同步块时会发生什么?它是否会以某种方式为当前监视器调用notify或notifyAll


我真的很纠结于此。

我认为最好从底层同步原语的角度来考虑:java监视器是一个互斥体,同步块是一个互斥体锁定在
{
上、解锁在
}
上并等待的区域,notify和notifyAll是对与互斥体关联的条件变量调用的方法

需要记住的重要一点是,当调用
wait()
时,互斥锁可以在同步块内解锁,因为wait将解锁互斥锁和块,直到调用notify或notifyAll

因此,尽管推断这是不可能的,但仍可以在同步块中阻止多个线程

更新:说明以下内容的注释代码:

对象锁;
// ...
已同步(锁定){//基础互斥锁已锁定。
// ...
lock.wait();//解锁互斥锁,阻塞直到通知,重新锁定互斥锁
// ...
}//基础互斥锁已解锁

调用
lock.wait()
后,其他线程可以自由进入同步块。它们也将被阻止,直到
lock.notify()
lock.notifyAll()
唤醒它们。

一个线程不能对另一个线程执行
wait()
的可能重复。线程只能通过调用
o.wait()
来阻止自身。在
synchronized
块的开头和结尾发生的操作在Java语言本身中不可用。它们必须在JVM中实现,而且在大多数情况下,JVM只是调用操作系统。@jameslarge你说得对。另外,当我问一个问题时,我误解了等待过程:我认为等待与线程等待释放监视器时的阻塞状态相同。事实上,它有自己的等待集来处理所有wait()和notify()calls.by's block until notify或notifyAll您的意思是它进入等待集吗?@JamesFord-我已经在答案中添加了注释代码来演示这一点。@JamesFord-如果您可以接受答案,请随意接受。事实上,我被您解释的有点不同,但答案是有效的,谢谢。