美文网首页
notify 和 notifyAll 注意事项

notify 和 notifyAll 注意事项

作者: 莫库施勒 | 来源:发表于2019-06-11 17:34 被阅读0次
  1. notify后,当前线程不会马上释放该对象锁,wait所在的线程并不能马上获取该对象锁,要等到程序退出synchronized代码块后,当前线程才会释放锁,wait所在的线程也才可以获取该对象锁

  2. notifyAll使所有原来在该对象上wait的线程统统退出wait的状态——即全部被唤醒,不再等待notify或notifyAll,但由于此时还没有获取到该对象锁,因此还不能继续往下执行。在当前线程退出synchronized代码块,释放锁后,其他的已经被唤醒的线程将会继续竞争获取该锁,一直进行下去,直到所有被唤醒的线程都执行完毕。

  3. 假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了synchronized代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

  4. 应该永远在while循环,而不是if语句中调用wait——例如在缓冲区为满的时候生产者继续生成数据,或者缓冲区为空的时候消费者开始消耗数据。

相关文章

网友评论

      本文标题:notify 和 notifyAll 注意事项

      本文链接:https://www.haomeiwen.com/subject/cufcfctx.html