当前位置: 首页 > news >正文

Java并发编程:sleep()与wait()核心区别详解

今天完成了实验室纳新网站的工作,大体功能都已经完善,也和前端测试过了,费了点时间,而且今天大部分时间在看langchain4j的东西,就简单复习一下八股,等会再复习一下算法题吧

在Java并发编程中,sleep()wait()都用于暂停线程执行,但它们在设计目的、行为和使用场景上有本质区别。以下是详细对比及示例说明:

核心区别总结

特性sleep()wait()
所属类Thread类的静态方法Object类的实例方法
锁释放❌ 不释放任何锁✅ 释放对象锁(只释放调用它的对象的锁)
唤醒条件超时结束或被中断(InterruptedException需其他线程调用notify()/notifyAll()或超时
同步要求无需在同步块中调用必须在synchronized块或方法中使用
用途单纯暂停当前线程线程间通信(协调多个线程的执行顺序)

示例代码解析

示例1:sleep()不释放锁(独占锁场景)
public class SleepDemo {public static void main(String[] args) {Object lock = new Object();new Thread(() -> {synchronized (lock) {System.out.println("Thread-1: 获得锁,开始sleep(2000)");try {Thread.sleep(2000); // 暂停2秒,但不会释放lock锁} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread-1: sleep结束,释放锁");}}).start();new Thread(() -> {synchronized (lock) {System.out.println("Thread-2: 获得锁"); // 需等待Thread-1释放锁}}).start();}
}

输出结果:

Thread-1: 获得锁,开始sleep(2000)
(等待2秒...)
Thread-1: sleep结束,释放锁
Thread-2: 获得锁

结论sleep()期间不释放锁,其他线程无法进入同步块。

示例2:wait()释放锁(线程协作场景)
public class WaitDemo {public static void main(String[] args) throws InterruptedException {Object lock = new Object();// 等待线程new Thread(() -> {synchronized (lock) {System.out.println("Thread-1: 获得锁,调用wait()释放锁");try {lock.wait(); // 释放lock锁,进入等待状态} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread-1: 被唤醒,重新获得锁");}}).start();Thread.sleep(500); // 确保Thread-1先执行// 唤醒线程new Thread(() -> {synchronized (lock) {System.out.println("Thread-2: 获得锁,执行notify()");lock.notify(); // 唤醒Thread-1(但需退出同步块才释放锁)System.out.println("Thread-2: notify()后,仍持有锁2秒");try {Thread.sleep(2000); // sleep()不释放锁} catch (InterruptedException e) {e.printStackTrace();}}}).start();}
}

输出结果:

Thread-1: 获得锁,调用wait()释放锁
Thread-2: 获得锁,执行notify()
Thread-2: notify()后,仍持有锁2秒
(等待2秒...)
Thread-1: 被唤醒,重新获得锁

结论

  1. wait()立即释放锁Thread-2得以进入同步块。
  2. Thread-2调用notify()后,Thread-1需等待Thread-2退出同步块(释放锁)才能重新获得锁并继续执行。

关键点详解

  1. 锁释放机制

    • sleep():线程暂停但保留所有锁,可能导致其他线程阻塞。
    • wait():释放调用对象的锁,允许其他线程获得锁并执行。
  2. 唤醒方式

    • sleep():超时结束或调用线程的interrupt()方法。
    • wait():需其他线程显式调用notify()/notifyAll(),或超时(若设置了超时时间)。
  3. 使用约束

    • wait()/notify()必须synchronized代码块中调用,否则抛出IllegalMonitorStateException
    • sleep()可在任何上下文调用(但需处理InterruptedException)。
  4. 设计目的

    • sleep():用于定时任务(如轮询间隔)、模拟耗时操作。
    • wait():用于线程协作(如生产者-消费者模型),避免忙等待(busy-waiting)。

经典应用场景

  • sleep():定时任务调度(如每5秒检查一次状态)、模拟网络延迟。
  • wait()/notify():线程间协调(如生产者生产后通知消费者)、条件等待(等待资源就绪)。

重要提示:Java 5+推荐使用java.util.concurrent包的ConditionCountDownLatch等高级工具替代wait()/notify(),以简化并发控制。

http://www.dtcms.com/a/367205.html

相关文章:

  • 通过Interface扫描获取所有其实现类
  • AI 浪潮下阿里云“高光”乍现,但离终局胜利尚远
  • MySQL主从复制进阶(GTID复制,半同步复制)
  • 搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼
  • 鸿蒙NEXT动画开发指南:组件与页面典型动画场景解析
  • ios按键精灵提示 “设备信息丢失”如何处理?
  • 在Ant Design Vue 中使用图片预览的插件
  • Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头停止移动 Stop 功能
  • 【RNN-LSTM-GRU】第五篇 序列模型实战指南:从选型到优化与前沿探索
  • 对于数据结构:链表的超详细保姆级解析
  • 从0到1搭建某铝箔智慧工厂网络:5G与WiFi 6助力智能制造
  • 2025年财会领域专业资格认证选择指南
  • AR眼镜在智能制造的应用方向和场景用例|阿法龙XR云平台
  • BERT家族进化史:从BERT到LLaMA,每一次飞跃都源于对“学习”的更深理解
  • 【深度学习】P1 引言:深度学习的万家灯火
  • 网络安全初级-渗透测试
  • 下载apache-maven-3.6.1版本并配置maven镜像及本地仓库[超简单]
  • Hunyuan-MT-7B模型介绍
  • 告别低效广告!亚马逊关键词筛选全流程攻略
  • matlab版本粒子群算法(PSO)在路径规划中的应用
  • ultralytics/nn/tasks.py源码学习笔记——核心函数parse_model
  • 【正整数的最优分解2的次方和形式非0次方】2022-11-1
  • Java基础知识点汇总(五)
  • 什么是压力测试,有哪些方法
  • AI入坑: Trae 通过http调用.net 开发的 mcp server
  • IIS服务器下做浏览器缓存
  • 小白学OpenCV系列3-图像算数运算
  • jQuery 入门:一份献给初学者的完全指南
  • 怎么做到这一点:让 Agent 可以像人类一样 边听边想、边说,而不是“等一句话 → 一次性返回”
  • 风险慎投!IF 狂跌10分,国人发文超80%,这本SCI的1区TOP还能撑多久?