为什么在线程未在同步内部传递时调用wait()

时间:2012-05-27 21:12:21

标签: java multithreading thread-safety

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

请帮我理解..........你的帮助。我已经看到了各种各样的链接,你的个人话语向我解释它只用了一段,对我来说很重要。

三江源

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

javadoc说得非常清楚:

  

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