我很好奇,当我的线程进入同步块并阻塞监视器时,下面会发生什么。
它实际上是否在尝试使用此监视器的所有其他线程上隐式调用wait()?还是监视器有一些特定的标志需要更改?
另外,当我们离开同步块时会发生什么?是否以某种方式调用当前监视器的notify或notifyAll?
我对此真的很纠结。
我认为最好从基础同步原语方面来考虑:java监视器是一个互斥锁,一个同步块是一个互斥锁被锁定{
和解锁}
并等待,notify和notifyAll是对相关条件变量进行调用的方法的区域。与互斥。
要记住的重要一点是,互斥锁在wait()
调用时可以在同步块内解锁,因为等待将解锁互斥锁并阻塞,直到调用notify或notifyAll为止。
因此,尽管推断不可能,但多个线程仍可以在同步块内被阻塞。
更新:带注释的代码说明了这一点:
Object lock;
// ...
synchronized (lock) { // Underlying mutex is locked.
// ...
lock.wait(); // Unlocks mutex, blocks until notify, relocks mutex
// ...
} // Underlying mutex unlocked
一旦lock.wait()
调用,其他线程就可以自由进入同步块。它们也会阻塞直到alock.notify()
或lock.notifyAll()
唤醒它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句