说说wait()和sleep的区别

1. 得分点

所属的类型不同、对锁的依赖不同、返回的条件不同、使用方式不同

2. 标准回答

wait()和sleep()方法主要有以下3个区别:

  1. 所属类型不同:

    • wait()Object类的实例方法,调用该方法的线程将进入WAITING状态
    • sleep()Thread类的静态方法,调用该方法的线程将进入TIMED_WAITING
  2. 对锁的依赖不同:

    • wait()依赖于synchronized锁,它必须通过监视器进行调用,在调用后会释放锁
    • sleep()不依赖任何锁,所以在调用后不会释放锁
  3. 返回的条件不同:

    • 调用wait()进入等待状态的线程,需要由notify()/ notifyAll()唤醒,进入就绪状态,从而返回
    • 调用sleep()进入睡眠的线程,在超时时间到达后自动返回或者使用interrupt()方法中断,进入就绪状态(sleep())方法只是让出CPU,并不会让出同步资源锁
  4. 使用方式不同:

    • wait()只能在同步方法或者同步代码块中调用,否则会报illegalMonitorStateException异常,如果没有设置超时时间,使用notify()来唤醒
    • sleep()能在任何地方调用

3. 加分项

  1. wait()方法也支持超时参数,线程调用带有超时参数的wait()会进入TIMED_WAITING状态,在此状态下的线程可以通过notify()/ notifyAll()唤醒从而返回,若在超时时间结束后仍未被唤醒则自动返回.

  2. 如果采用Lock进行线程同步,则不存在同步监视器,此时需要使用Condition的方法实现等待。

  3. Condition对象是通过Lock对象创建出来的,它的await()方法会导致线程进入WTING状态,它的带超时参数的await()方法会导致线程进入TIMED_WAITING状态,当调用它的signal()/signalAll()方法时,线程会被唤醒从而返回。