wait()/notify():调用任意对象的 wait()方法导致线程阻塞,并且该对象上的锁被释放。而调用任意对象的notify()方法则导致因调用该对象的wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
synchronized与这两个方法之间的关系:
1.有synchronized的地方不一定有wait,notify
2.有wait,notify的地方必有synchronized.这是因为wait和notify不是属于线程类,而是每一个对象都具有的方法(事实上,这两个方法是Object类里的),而且,这两个方法都和对象锁有关,有锁的地方,必有synchronized。
锁是针对对象的,wait()/notify()的操作是与对象锁相关的,那么把wait()/notify()设计在Object中也就是合情合理的了。
为什么有wait,notify的地方必有synchronized?
synchronized方法中由当前线程占有锁。另一方面,调用wait()notify()方法的对象上的锁必须为当前线程所拥有。因此,wait()notify()方法调用必须放置在synchronized方法中,synchronized方法的上锁对象就是调用wait()notify()方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException
异常。
能调用wait()/notify()的只有当前线程,前提是必须获得了对象锁,就是说必须要进入到synchronized方法中。