笔友城堡 - 可定义的个人主页

前言

wait()和sleep()是java面试中比较常见的,也是java并发的基础知识点,记录于此,方便自己查阅和学习。

正文

sleep

不会释放锁

synchronized (lock) {
    Thread.sleep(1000); // 抱着锁睡觉
}

只让当前线程暂停执行,其他线程无法获取到锁。

唤醒方式
  1. 时间到

  2. interrupt(中断)

wait()

会释放锁

synchronized (lock) {
    lock.wait(); // 释放锁,等待被唤醒
}

当前线程释放锁,其他线程可以竞争锁

wait()必须放在 synchronized中,否则会抛IllegalMonitorStateException

synchronized可以保证可见性、原子性、有序性

唤醒方式
  1. notify()

  2. notifyAll()

  3. 超时

  • notify()不会立刻释放锁

  • 真正释放是在synchronized块结束

六、使用场景对比

场景用谁
单纯让线程暂停Thread.sleep()
线程间协作wait()/ notify()
生产者-消费者wait()/ notifyAll()
定时任务sleep()

总结

  1. sleep() 不释放锁,只是让线程“睡一会”;

  2. wait() 会释放锁,并且必须在 synchronized 中使用。

对比点wait()sleep()
所属类ObjectThread
是否释放锁✅ 释放锁❌ 不释放锁
使用位置必须在 synchronized任意地方
唤醒方式notify()/ notifyAll()/ 超时超时 / 中断
是否需要捕获异常✅ InterruptedException✅ InterruptedException
是否依赖锁对象✅ 是❌ 否
设计目的线程协作暂停执行

参考文章

AI

相关网址

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...