关于并发运行的线程以及它们对对象的锁定,我只有一个问题。据我所知,调用wait()方法的线程将进入等待列表,并允许来自阻塞列表的另一个线程接管锁定和对象(在同步代码中)。 如果现在对该对象具有锁定的此线程调用notify()方法,则它会唤醒调用wait()的线程,并将其移动到阻止列表。
调用notify()方法的线程会发生什么。它是否仍然锁定对象或现在是否在等待名单上?
问候
答案 0 :(得分:5)
只有一个线程可以保存对象的锁定。当线程持有对您调用这些方法的对象的锁时,必须调用wait()
和notify()
方法;如果他们不这样做(例如,因为你没有在对象上同步),你将获得IllegalMonitorStateException
。
当你调用wait()
时,线程放弃锁定并进入等待列表(停止执行)。当wait()
返回时,线程将再次获得锁定。但是,调用notify()
的线程仍然保持锁定,因此等待线程将不会在通知线程退出synchronized
块或方法之前恢复,以便释放对象的锁定。
通过调用notify()
,线程不会放弃对象的锁定。
可能的一系列事件将是:
synchronized
块,获取对象的锁wait()
,放弃锁定,停止执行synchronized
块,获取对象的锁notify()
,但仍保留锁synchronized
块并释放锁wait()
答案 1 :(得分:4)
通知线程仍然拥有锁。请参阅doc第17.14节(页面底部):
仅当当前线程已锁定对象的锁定时,才应为对象调用notify方法。如果对象的等待集不为空,则从等待集中删除一些任意选择的线程并重新启用以进行线程调度。 (当然,在当前线程放弃对象的锁定之前,该线程将无法继续。)
答案 2 :(得分:1)
不,它会通过保留同步块或从同步方法返回来释放锁定。在再次呼叫wait()
之前,它不会返回等待列表。