每个对象都有一个monitor对象,只有获取到这个monitor对象后,将当前线程id写至这个对象的monitorObject的_waitSet列表中。
如果当前线程没有锁住该对象,可能会造成数据的紊乱,因此必须要当前线程锁住该对象后,才能放心将当前线程的ID写入_waitSet列表中;
因此所有obj.wait()都需要写在 synchronized的方法中,或代码块中,例如:
synchronized(obj) {
obj.wait(); //本句执行后,obj上的锁会被释放
}
synchronized(obj) {
obj.notify(); //本句执行后,obj上的锁不会被释放
}
另notify()和notifyAll()的区别:
notify:只唤醒一个在等待的线程;
notifyAll:唤醒所有在等待的线程;