wait & notify/notifyAll

184 阅读1分钟

1.wait()

  • 调用wait()方法必须先拿到调用对象的锁
  • 释放调用对象的锁(Thread.sleep()不会释放锁),线程进去waiting状态,将该线程放入等待队列,等待调用对象调用notify()/notifyAll()唤醒。

2.notify()/notifyAll()

  • 对象调用notify()等待线程不会马上从wait()响应,等调用该对象notify()方法的线程释放锁后,等待对象才有机会从wait()响应。
  • 对象调用notify()会将一个等待线程从等待队列放入同步队列,notifyAll()会将所有等待线程放入同步队列,被移动的线程状态从waiting变为blocked。
  • 如果是通过notify来唤起的线程,那 先进入wait的线程会先被唤起来; 如果是通过nootifyAll唤起的线程,默认情况是 最后进入的会先被唤起来,即LIFO的策略;

具体参考文献(啃碎并发(二):Java线程的生命周期