道理就像卖票的那个一样判断flag为真之后,该生产线程wait,wait之后在此醒来也是从判断完成的地方醒来,但此时,flag的值已经被其他运行的线程改变了,再次运行以下代码会打印错误的生产者,消费线程情况类似。 把if(flag)判断更改为while(flag),这样该线程notify()之后由于循环的原因会再次判断flag的值,这样就可以解决线程不同步的问题。
但是这样会造成一个新的问题就是死锁,循环的加入意味着,循环判断flag的值,经过几次判断之后,生产者没有唤醒消费者,而是唤醒的另一个生产者,生产者再判断flag,这时自己也wait了,此时所有的任务线程全部沉睡在线程池中了,程序停在那儿。所以,这样会造成死锁情况的出现。当然,也可能出现死锁和谐的情况,但是有死锁的话,不一定什么时候程序就停在那儿不动了。
亲,明白了木有? |