wait、sleep、notify、notifyAll方法总结

wait和sleep方法区别

  1. wait方法位于Object类中,sleep方法位于Thread类中
  2. 在调用wait方法时,线程必须持有被调用对象的锁,当调用wait方法后,线程就会释放掉该对象的锁(monitor);sleep方法不会释放对象锁
  3. wait方法需要在同步方法或者代码块中执行,sleep没有限制
  4. wait方法执行后唤醒需要等待其他线程调用对象的notify或者notifyAll方法,sleep执行结束即可唤醒,或者调用interrupt方法两种情况都可以唤醒

wait、notify和notify

  1. 当调用wait时,首先需要确保调用了wait方法的线程已经持有了对象的锁
  2. 当调用wait后,该线程就会释放这个对象的锁,然后进入到等待状态 (wait set)
  3. 当线程调用了wait后进入等待状态时,它就可以等待其他线程调用相同对象的notify和notifyAll方法来使得自己被唤醒
  4. 一旦这个线程被其他线程唤醒后,该线程就会与其他线程一同开始竞争这个对象的锁(公平竞争);只有当这个线程获取了这个对象的锁后,线程才会继续往下执行
  5. 调用wait方法的代码片段需要放在一个synchronized块或者synchronized方法中,这样才可以确保线程在调用wait方法前已经获取到了对象的锁
  6. 当调用对象的notify方法时,它会随机唤醒该对象等待集合(wait set)中的任意一个线程,当某个线程被唤醒后,它就会与其他线程一同竞争对象的锁
  7. 当调用对象的notifyAll方法时,它会唤醒该对象等待集合(wait set)中的所有线程,这些线程被唤醒后,又会开始竞争对象的锁
  8. 在某一时刻只有唯一一个线程可以拥有对象的锁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章