wait和sleep方法区别
- wait方法位于Object类中,sleep方法位于Thread类中
- 在调用wait方法时,线程必须持有被调用对象的锁,当调用wait方法后,线程就会释放掉该对象的锁(monitor);sleep方法不会释放对象锁
- wait方法需要在同步方法或者代码块中执行,sleep没有限制
- wait方法执行后唤醒需要等待其他线程调用对象的notify或者notifyAll方法,sleep执行结束即可唤醒,或者调用interrupt方法两种情况都可以唤醒
wait、notify和notify
- 当调用wait时,首先需要确保调用了wait方法的线程已经持有了对象的锁
- 当调用wait后,该线程就会释放这个对象的锁,然后进入到等待状态 (wait set)
- 当线程调用了wait后进入等待状态时,它就可以等待其他线程调用相同对象的notify和notifyAll方法来使得自己被唤醒
- 一旦这个线程被其他线程唤醒后,该线程就会与其他线程一同开始竞争这个对象的锁(公平竞争);只有当这个线程获取了这个对象的锁后,线程才会继续往下执行
- 调用wait方法的代码片段需要放在一个synchronized块或者synchronized方法中,这样才可以确保线程在调用wait方法前已经获取到了对象的锁
- 当调用对象的notify方法时,它会随机唤醒该对象等待集合(wait set)中的任意一个线程,当某个线程被唤醒后,它就会与其他线程一同竞争对象的锁
- 当调用对象的notifyAll方法时,它会唤醒该对象等待集合(wait set)中的所有线程,这些线程被唤醒后,又会开始竞争对象的锁
- 在某一时刻只有唯一一个线程可以拥有对象的锁