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/