登录
首页 >  文章 >  java教程

sleep与wait区别全解析

时间:2026-02-07 12:37:32 235浏览 收藏

小伙伴们有没有觉得学习文章很有意思?有意思就对了!今天就给大家带来《Java中sleep与wait的区别详解》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

根本区别在于锁的处理:sleep() 不释放锁且无需同步上下文,wait() 必须在 synchronized 块中调用并立即释放锁。

在Java里sleep和wait有什么区别_Java线程控制方式说明

sleep() 和 wait() 的根本区别在哪?

一句话结论:sleep() 是让当前线程“打个盹”,不放锁、不依赖同步;wait() 是让当前线程“请假等通知”,必须在 synchronized 块里调用,且会立刻释放锁。

为什么 wait() 必须写在 synchronized 里?

因为 wait() 的语义是“我先放手这个锁,等别人喊我再抢回来”——没拿着锁就喊“我放手”,JVM 直接抛 IllegalMonitorStateException。这不是设计缺陷,而是强制你显式表达“我确实在保护共享状态”。

  • wait() 调用前必须已进入该对象的 monitor(即已获得锁)
  • sleep() 完全不管锁的事,连对象都不需要,Thread.sleep(100) 随处可写
  • 常见错误:把 obj.wait() 写在非同步块里 → 运行时报错,不是编译错

锁会不会被释放?这是最易踩的坑

写错地方,轻则逻辑卡死,重则死锁。关键看锁:

  • sleep():线程暂停,但锁纹丝不动。其他线程想进同一 synchronized 方法?等着。
  • wait():一执行就交出锁,别的线程立刻能进 —— 所以它常配合 notify()/notifyAll() 用,否则没人能唤醒它
  • 反模式示例:
    synchronized (lock) {
        Thread.sleep(1000); // 锁还在!别人进不来
        lock.wait();        // 这才放手
    }

怎么选?看你要解决什么问题

别背区别,看场景:

  • 要“延时执行”或“降低轮询频率” → 用 sleep()。比如每秒查一次数据库:Thread.sleep(1000)
  • 要“等某个条件成立”(如队列有数据、资源就绪)→ 用 wait() + notify()。比如生产者往队列塞完,notify() 消费者
  • 想带超时又不想依赖别人唤醒?wait(5000) 可以,5 秒后自动争锁继续;sleep(5000) 则纯靠时间驱动

真正容易被忽略的是:两者都抛 InterruptedException,而很多开发者只 catch 却不 restore 中断状态(即没调 Thread.currentThread().interrupt()),这会让上层调度逻辑失效。

今天关于《sleep与wait区别全解析》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>