JUC之sleep vs wait

JUC之线程状态这篇博客中,我提到了除了调用锁对象的wait(long)会让线程进入有时限等待外,还可以通过调用sleep(long)方法,来进入有时限等待状态。在这篇博客中,我就讲讲两者的对比。

共同点

  • wait()、wait(long)和sleep(long)的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态
  • 三者都可以被打断唤醒。

不同点

方法归属不同

  • sleep(long)是Thread的静态方法。
  • wait()、wait(long)则是Object的成员方法,因此,每个对象都有这个方法。

醒来时机不同

三者除了都可以被打断唤醒外,醒来时机还有些不同:

  • 执行wait(long)和sleep(long)的线程都会在等待相应时间(单位为毫秒)后醒来,而wait则不会。
  • wait和wait(long)则还可以被notify唤醒,并且如果执行wait()的线程如果不被唤醒,就会一直等下去。

锁特性不同

  • wait方法的调用必须先获取wait对象的锁,而sleep则无此限制(线程未必是持有锁才能运行)。
  • wait方法执行后,会释放对象锁,允许其他线程获得该对象锁。(锁执行的wait,锁是自由的)。
  • sleep方法如果在synchronized代码块中执行,则不会释放对象锁。(线程执行的sleep,带着锁睡觉)。

JUC之sleep vs wait
https://jlqusername.github.io/2025/03/30/wait/
作者
B907
发布于
2025年3月30日
许可协议