我有一个基本的疑问。 等待在Synchronized块内部调用,但是当有2个线程正在访问被synchronized锁定的块时,我想当一个线程已经进入同步时,另一个线程无法进入块?但是我看到它会一直执行wait(),其他线程进入临界区。所以在关键部分内有2个线程作为一个线程,在wait()调用时等待。这真的是它的工作方式吗?这些年来,我一直认为同步块中一次只能有一个线程。
请帮我理解..........你的帮助。我已经看到了各种各样的链接,你的个人话语向我解释它只用了一段,对我来说很重要。
三江源
答案 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方法。线程然后 等到它可以重新获得监视器的所有权并恢复 执行。