wait()和notify()是用来 做线程同步用的, 他们都必须在synchronized语句块中调用。
进入synchronized块表示获得了对象锁,离开synchronized块表示释放了对象锁(对象锁释放了,其他等待此对象锁的线程就可以执行自己的synchronized语句块了)。
那么对象锁是个什么概念呢?
你可以把任何对象视做一把锁(? extends Object),锁是Java对象与生俱来的特性。
synchronized (mLock), mLock就是一个对象(可以是任何对象),synchronized的意思就是尝试获得锁。如果得到了锁,那么其他线程的synchronized(mLock)语句将会阻塞,直到获得锁的synchronized语句块执行完毕或者mLock.wait()被调用。
当我们在synchronized块 中调用mLock.wait()方法,那么调用线程(线程A)就会阻塞在wait()语句那里,直到其他线程(线程B)调用mLock.notify()方法。
当mLock.notify()方法调用完成后,并不表示线程A可以立即执行,因为mLock.notify()方法也是在synchronized块中的,只有线程B继续执行直到离开synchronized块后(离开后就会释放mLock对象锁),线程A才能够获得对象锁并开始执行wait()之后的语句。