boolean flag = false;改为volatile boolean flag = false;

解决方案 »

  1.   

    我的看法,楼主参考:
    问题就是当wait()结束后,程序从哪接着执行?正常情况下,wait()结束,应该执行else语句块里的内容,但你把它放在else里,它就不执行了,跳过了赋值语句。
    另外,这种情况下最好用while,不用if,某些场合会出问题。
      

  2.   

    你说的很对。今天我看生产者和消费者的时候,理解了昨天的问题。确实是你说的那样,当一个线程从wait()中唤醒了后,是直接往下运行,这个时候如果我加了else的话,直接就从else上面跳过去了,虽然此刻flag=false,接着往下运行后此刻的值还是原来那个值,num的值转变了,结果还是之前的值,不是没变,而是跳过去了。所以,这里不能加else。