繁体   English   中英

当线程进入 Java 中的同步块/方法时究竟会发生什么

[英]What exactly happens when thread enters a synchronized block / method in Java

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

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

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

我真的很纠结这个。

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

需要记住的重要一点是,当调用wait()时,mutex 可以在同步块内解锁,因为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()被调用,其他线程就可以自由进入同步块 它们也会阻塞,直到lock.notify()lock.notifyAll()唤醒它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM