线程在Java

时间:2015-09-30 17:08:01

标签: java multithreading synchronized

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

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

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

我真的很纠结于此。

1 个答案:

答案 0 :(得分:5)

我认为最好根据底层同步原语进行思考:java监视器是互斥锁,同步块是互斥锁在{上锁定并在}时解锁的区域。 wait,notify和notifyAll是与互斥锁相关的条件变量调用的方法。

要记住的重要一点是,当调用wait()时,互斥锁可以在同步块中解锁,因为 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()唤醒它们。