楼主经过我仔细研究 没问题真的count变量改一下别2个都count++ ,
关于上面哥们说的: 怀疑是这样的,某时刻消费者1抢到锁对象,进入同步代码快,判断条件不符,await()了,就放弃了锁对象,但是它仍处于同步代码区。然后消费者2抢到了锁对象,判断条件也不符,也await()了,放弃了锁对象,它也仍处于同步代码区。下一次恰好生产者1抢到锁对象,判断条件符合,执行完后signal(),这个时候同时唤醒了两个消费者,由于他们都已经在同步代码区,所以他们判断条件符合就并发访问了共享数据count。
请看>>> 消费者try里面的while(!flag) 我们假设消费者1消费一次,然后消费者1又获取权限由于flag=false,等待了, 消费者2获取权限进来也等待了, 就算生产者同时唤醒了消费者2次,消费者1消费一次,flag又等于false这个时候消费者2是唤醒的取得执行权位置在await()那,这个时候注意!!!while(!flag)里面是true那么这个时候就算消费者2执行也要返回判断一下吧,里面是true不又在那await()了,无论如何那个哥们你告诉我2个消费者就算被同时唤醒,他怎么同时执行2次 无论消费者1或2只要消费过一次是不是!flag都变成true了是不是另一个都进while判断了 恩? |