-2

我有一个基本的疑问。在同步块内部调用等待,但是当有2个线程正在访问被同步锁定的块时,我想当一个线程已经进入同步时,另一个线程无法进入块?但我看到它运行了,一旦执行 wait() 其他线程进入临界区。所以临界区内有 2 个线程,作为一个线程,在 wait() 调用中等待。这真的是它的工作方式吗?这些年来,我一直认为同步块内一次只能有 1 个线程。

请帮助我理解它............你的帮助。我看过各种链接,您的个人文字仅用一段话就解释了我的工作,对我来说很重要。

谢谢

4

2 回答 2

1

调用 wait() 会挂起正在执行的线程并释放 synchronize 持有的锁。当通过调用 notify() 或 notifyAll() 结束 wait() 时,在从 wait() 返回之前重新获取锁。

于 2012-05-27T21:15:58.890 回答
1

wait在对象上调用时,对象上的锁会自动释放,以允许其他线程取得进展。例如:

synchronized(obj) {
    obj.wait();
}

例如,当一个线程获得锁obj然后调用时obj.wait(),该线程被挂起并obj释放对象上的锁以允许另一个线程调用obj.notify()

javadoc说得很清楚:

当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待直到它可以重新获得监视器的所有权并恢复执行。

于 2012-05-27T21:16:08.000 回答