java的wait和notify方法:
     在生产者和消费者问题中,有一个公共的产品池,设它一次能装20个商品,使用这两个方法有没有对这个公共的产品池加锁?也就是假如我往产品池用生产方法已装了19个商品,在第20次装入时,20这个数据还没有写入的时候,消费者有没有可能在取商品,然后抢先写回,这样商品数为18,等生产者写回的时候,造成一次修改丢失,商品数量变成20?

解决方案 »

  1.   

    wait,notify是同步(加锁)的前提下使用才有意义的
    所以,你的产品池的读取和写入应该用同步方法
      

  2.   

    也就是这两个方法其实没有多大的意义是吗?
    也就是比如生产者,当它发现商品数量大于20时,不必wait,可以执行一次空操作,是这个意思吗?
      

  3.   

    不是这个意思
    这个两个方法有意义,只不过它的意义是建立在同步的基础上
    如果生产者检查商品数时,这个产品池没有加锁的话,它可能取到的产品数不准确,因为不加锁的话,消费者也可以读取产品池,所以,为了二者同步,就要用同步方法加锁。一旦用了同步方法,如果生产者发现产品池满时,不用wait抛出锁的话,消费者就一直在等待锁,这样消费者就不能被执行,所以wait在这种情况下有意义,wait的同时,也需要唤醒其他正在wait的线程,如果不唤醒,这些线程就一直在wait,也就说这些线程也不会执行,所以,这就是notify的意义。