Java 理解多线程
我只是有一个关于并发运行的线程和它们对对象的锁的问题。据我所知,调用wait()方法的线程将进入等待列表,并允许阻止列表中的另一个线程接管对象上的锁(在同步代码中)。 如果这个对象上现在有锁的线程调用notify()方法,它会唤醒调用wait()的线程,并将其移动到阻止列表中 调用notify()方法的线程会发生什么情况。它是否仍然锁定对象,还是现在已进入等待列表Java 理解多线程,java,multithreading,Java,Multithreading,我只是有一个关于并发运行的线程和它们对对象的锁的问题。据我所知,调用wait()方法的线程将进入等待列表,并允许阻止列表中的另一个线程接管对象上的锁(在同步代码中)。 如果这个对象上现在有锁的线程调用notify()方法,它会唤醒调用wait()的线程,并将其移动到阻止列表中 调用notify()方法的线程会发生什么情况。它是否仍然锁定对象,还是现在已进入等待列表 通知线程仍然拥有锁。见第17.14节(本页底部): 仅当当前线程已锁定对象的锁时,才应为对象调用notify方法。如果对象的等待集不
通知线程仍然拥有锁。见第17.14节(本页底部): 仅当当前线程已锁定对象的锁时,才应为对象调用notify方法。如果对象的等待集不是空的,那么将从等待集中删除一些任意选择的线程,并重新启用线程调度。(当然,在当前线程放弃对象的锁定之前,该线程将无法继续。)
否,它将通过离开同步块或从同步方法返回来释放锁。在再次调用
wait()
之前,它不会返回等待列表 只有一个线程可以持有对象的锁。当线程在调用这些方法的对象上持有锁时,必须调用wait()
和notify()
方法;如果它们不同步(例如,因为您没有在对象上同步),您将得到一个IllegalMonitorStateException
当您调用wait()
时,线程将放弃锁并进入等待列表(停止执行)。当wait()
返回时,线程将再次获得锁。但是,调用notify()
的线程仍然持有锁,因此在通知线程退出synchronized
块或方法之前,等待的线程不会恢复,从而释放对象上的锁
通过调用notify()
线程不会放弃对对象的锁定
可能的事件顺序是:
- 线程1进入
块,获取对象的锁synchronized
- 线程1调用对象上的
,放弃锁,停止执行wait()
- 线程2进入
块,获取对象的锁synchronized
- 线程2调用对象上的
,但仍然持有锁notify()
- 线程1被唤醒并试图获得锁,但它不能,因为线程2仍然拥有它(因此线程1必须等待锁)
- 线程2退出
块并释放锁synchronized
- 线程1现在可以从
wait()