Object.wait()¬ify是属于比较常见的多线程同步方式
首先了解用法之前,我们先要清楚多线程在通过这个方法进行同步时有哪些状态。假设下列两个线程同时start
1.Alive => wait() ——————–=========③=>function()=>notify()====④=>
2.Alive=====①=>function()=>notify()②=>wait()————————–=======
=:等待阶段,因为JVM分配不到它工作,等待锁资源释放。
-:wait阶段,不活跃,直到某个持有锁资源的线程调用notify()或者notifyAll()
①一阶段之所以2线程处于等待阶段,是因为JVM先分配资源给了1线程
②部分当2线程调用notify()后JVM唤醒了1线程(注意!如果这里有2个线程处于wait状态,只会随机唤醒一个)
③2线程wait后,1线程被安排开始工作
④注意这里1线程工作,调用notify()后没有wait,故1、2线程都等待JVM分配,恰好1线程又被分配到,所以继续进行。
Object由于是比较老的线程同步,所以我在写消费者生产者时候总是会遇见线程没有拥有锁资源却调用wait()¬ify()的错误——IllegalMonitorStateException
后面采用了1.5新增的Lock和Condition的await() / signal()方法,下一章写