每个Java对象关联着一个监视器对象(也就是锁),一个等待线程集合,一个可运行线程集合。
只有一个线程能够占有监视器对象。
一个线程占有了监视器对象,才能够调用该对象的wait()方法。
一个线程占有了监视器对象,通过调用该对象的wait()方法,释放监视器对象,进入该对象的等待线程队列。
一个线程占有了监视器对象,通过调用该对象的notify()方法,能够能够通知该对象的等待线程集合中的某一个线程离开等待集合,进入可运行集合。
一个线程占有了监视器对象,通过调用该对象的notifyAll()方法,能够能够通知该对象的等待线程集合中的全部线程离开等待集合,进入可运行集合。
为了理解wait和notify方法,还需要对线程的状态有比较好的理解,至少要知道这两个方法会让相关的线程进入什么状态,如果感兴趣,可以看看另外一篇文章:Java线程状态转换图。