sleep() 和 wait() 的区别分析

sleep() 和 wait() 的区别

  1. sleep是线程中的方法,但是wait是Object中的方法。
  2. sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
  3. sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
  4. sleep不需要被唤醒(休眠之后推出阻塞,他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态),但是wait需要(不指定时间需要被别人中断)。

sleep是线程中的方法,wait是Object中的方法

由 jdk 的源码中可以看出

  • sleep是线程中的方法
    sleep() 和 wait() 的区别分析
  • wait是Object中的方法
    sleep() 和 wait() 的区别分析

sleep不释放lock,wait会释放

  • sleep 不释放 lock 的验证代码:
    sleep() 和 wait() 的区别分析
    运行结果:从下面结果中看到,线程2先获取了cpu资源,然后开始执行休眠,在休眠过程中线程1是没法执行的,必须要等待线程2结束之后才可以。这也就是说sleep方法不会释放锁,让其他线程进来。
    sleep() 和 wait() 的区别分析
  • wait 释放 lock 的验证代码:
    sleep() 和 wait() 的区别分析
    运行结果:从下面的结果中,线程2 wait ,线程1也可以 wait 操作,证明wait是释放了锁资源,让其他线程进来。
    sleep() 和 wait() 的区别分析

sleep不依赖同步方法,wait需要

  • sleep 不依赖同步方法的验证代码:
    sleep() 和 wait() 的区别分析
    运行结果:方法依次运行,不会出现任何异常。

  • wait 依赖同步方法的验证代码:
    sleep() 和 wait() 的区别分析
    运行结果:方法依次运行,出现任何异常。
    sleep() 和 wait() 的区别分析

sleep不需要被唤醒,wait需要

  • sleep 方法很简单,自己就会重新开始执行。
  • wait 方法的验证,定义一个等待方法,一个唤醒方法。
    sleep() 和 wait() 的区别分析
    测试一下定义的方法:
    sleep() 和 wait() 的区别分析
    运行结果:如果没有唤醒方法,那第一个线程就会处于一直等待的状态,第二个线程唤醒了之后就不再等待了。
    sleep() 和 wait() 的区别分析