我有一个基本的疑问。在同步块内部调用等待,但是当有2个线程正在访问被同步锁定的块时,我想当一个线程已经进入同步时,另一个线程无法进入块?但我看到它运行了,一旦执行 wait() 其他线程进入临界区。所以临界区内有 2 个线程,作为一个线程,在 wait() 调用中等待。这真的是它的工作方式吗?这些年来,我一直认为同步块内一次只能有 1 个线程。
请帮助我理解它............你的帮助。我看过各种链接,您的个人文字仅用一段话就解释了我的工作,对我来说很重要。
谢谢
我有一个基本的疑问。在同步块内部调用等待,但是当有2个线程正在访问被同步锁定的块时,我想当一个线程已经进入同步时,另一个线程无法进入块?但我看到它运行了,一旦执行 wait() 其他线程进入临界区。所以临界区内有 2 个线程,作为一个线程,在 wait() 调用中等待。这真的是它的工作方式吗?这些年来,我一直认为同步块内一次只能有 1 个线程。
请帮助我理解它............你的帮助。我看过各种链接,您的个人文字仅用一段话就解释了我的工作,对我来说很重要。
谢谢
调用 wait() 会挂起正在执行的线程并释放 synchronize 持有的锁。当通过调用 notify() 或 notifyAll() 结束 wait() 时,在从 wait() 返回之前重新获取锁。
当wait
在对象上调用时,对象上的锁会自动释放,以允许其他线程取得进展。例如:
synchronized(obj) {
obj.wait();
}
例如,当一个线程获得锁obj
然后调用时obj.wait()
,该线程被挂起并obj
释放对象上的锁以允许另一个线程调用obj.notify()
。
javadoc说得很清楚:
当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待直到它可以重新获得监视器的所有权并恢复执行。