粗浅来说:
- wait(),notify(),notifyAll()是Java中一种多线程通信机制,通信机制最重要的便是等待通知/发送通知/收到通知,在这三者之间必须维持这样的顺序,才能使机制正常工作.
- 在多线程环境之中这样的顺序可能会遭到破坏,比如,a线程在完成自己一半任务后,下一半任务需要等待b线程的工作结果,才能正确完成所有任务,那么,正常操作就是a线程完成一半任务后调用 wait(),进入等待状态,b线程在完成任务后则调用notify()通知a线程可以继续工作,若两个线程不加同步,则可能出现a在调用wait()方法之前b线程已经调用了notify()方法,导致a线程在调用wait()后永远不会收到b线程的通知,无法正常完成工作.那这这个通信模型就没有什么用了,所以,要维持在多线程中这个通信机制正常工作,这几个方法必须位于同步块(临界区内),以有序的节奏执行.
- 综上简短来说,wait(),notify(),notifyAll()这样的多线程通信机制需要同步机制来保证三个方法在多线程中的调用的顺序以维持通信机制的正常工作,而Synchronized关键字所代表的则是java同步机制的实现.
- 另外,wait(),notify(),notifyAll()都是navtive方法,本身就是基于Synchronized关键字的多线程通信机制的实现.java中还有lock接口相关,是代码层面的同步实现,其中也有condition接口实现多线程的等待/通知通信机制.