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.pswp.cn/web/95599.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR眼镜在智能制造的应用方向和场景用例|阿法龙XR云平台

AR巡检在制造业的应用已形成覆盖设备维护、质量检测、安全监控和远程协作四大类别的成熟场景,不同制造领域的实践各具特色,为行业提供了宝贵参考。在汽车制造领域,AR 巡检主要应用于生产线设备维护和焊接质量检测。在汽车厂总装车间部署 AR 系…

【Linux系统】线程同步

在上一章节中,我们使用互斥量之后,确实解决了数据竞争问题,但出现了新的问题:只有一个线程(thread 1)在处理所有售票任务。这展示了互斥量的一个局限性:它确保了线程安全,但不保证公…

代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字

56.合并区间 思路:先让二维数组进行排序; 遍历数组,定义一个min表示重合区间的左边界,max表示重合区间的右边界; 如果当前区间左边大于max,就证明重合区间断了,就要对它进行加入ArrayList&am…

【Unity项目经验分享】实现左右分屏裸眼3D程序

1、实现原理左右分屏原理,左右屏内容左右方向存在些许偏差。通过左右相机,然后左侧相机向左侧偏移一点3cm,右侧相机向右侧屏偏移一定3cm,然后将左右相机渲染内容通过RenderTexture渲染到Canvas上面的左右RawImage上面。2、实现具体…

设计软件启动失败?“找不到vcruntime140.dll,无法继续执行代码” 场景化解决方案来了

打游戏时,刚加载到登录界面就因 “找不到 vcruntime140.dll, 无法继续执行代码” 闪退;写代码时,编译工具突然报错中断工作;做设计时,PS、AE 启动失败弹出相同提示 —— 不同场景下的 vcruntime140.dll 错误&#xff0…

基于Echarts+HTML5可视化数据大屏展示-茶叶种植大数据溯源平台

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

PLOS One图片处理要求及处理办法

PLOS One图片处理&#xff1a; 要求&#xff1a;Please remove your figures from within your manuscript file, leaving only the individual TIFF/EPS image files. These will be automatically included in the reviewer’s PDF. 请从稿件文件中移除所有图表&#xff0c;…

AutoLayout与Masonry:简化iOS布局

Auto Layout 与 Masonry苹果提供的自动布局&#xff08;Auto Layout&#xff09;能够对视图进行灵活有效的布局。但是&#xff0c;使用原生的自动布局相关的语法创建约束的过程是非常冗长的&#xff0c;可读性也比较差。Masonry 的目标其实就是 为了解决原生自动布局语法冗长的…

从设计到落地:校园图书馆系统的面向对象实现全流程

很多小白学面向对象时总困惑&#xff1a;“类图、用例图我会画&#xff0c;但怎么把这些设计变成能跑的代码&#xff1f;” 这篇文章就用 “校园图书馆管理系统” 当例子&#xff0c;从需求分析→设计方案→代码实现→测试验证&#xff0c;带你走通 “设计→实现” 的完整链路&…

[鸿蒙心迹]带新人学鸿蒙的悲欢离合

2023年底&#xff0c;我和陆神&#xff0c;威哥&#xff0c;老罗一起去深圳参加了鸿蒙师资培训正式开启了鸿蒙之旅&#xff0c;当时和陆神拍的合照但是我把陆神打码了 学完以后就考取了鸿蒙的高级认证 看到没有时间是2023年11月 马上都要到期了。 想一想时间过得真快&#xff…

MindShow AI:AI思维导图生成工具高效解决思路混乱难题,快速搭建学习与工作大纲

你有没有过这种时候&#xff1f;想整理一份学习大纲或者项目方案&#xff0c;脑子裡一堆想法却散得像乱麻 —— 比如要做个 “数据分析入门规划”&#xff0c;明明知道要学 Excel、SQL、Python&#xff0c;可怎么分阶段、每个阶段学哪些重点&#xff0c;对着空白文档半天列不出…

快速搭建一个Vue+TS+Vite项目

1、在一个文件夹下通过cmd打开&#xff0c;输入命令npm create vitelatest命名要为英文2.选择项目框架通过上下键位选择Vue框架&#xff1a;选好按回车键3.选择开发语言选择TypeScript语言&#xff0c;方便后续开发&#xff1a;创建好的项目目录为&#xff1a;4.安装Vite依赖接…

深度学习:ResNet 残差神经网络详解

一、ResNet 残差神经网络的起源与核心地位ResNet&#xff08;Residual Neural Network&#xff0c;残差神经网络&#xff09;是 2015 年由微软亚洲研究院的何凯明、张祥雨等研究者提出的深度神经网络架构。在当年的 ImageNet 大规模视觉识别挑战赛&#xff08;ILSVRC&#xff0…

Python面试题及详细答案150道(116-125) -- 性能优化与调试篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 116. 如何查找Python程序的…

C++11 智能指针的使⽤及其原理

目录 1. 智能指针的使⽤场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使⽤ 4. 智能指针的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循环引⽤问题 5.2 weak_ptr 6. shared_ptr的线程安全问题 7. C11和boost中智能指针的关系 8. 内存泄漏 8.1 什么是…

【Linux】Linux进程状态和僵尸进程:一篇看懂“进程在忙啥”

前言&#xff1a;欢迎各位光临本博客&#xff0c;这里小编带你直接手撕Make/Makefile (自动化构建)&#xff0c;文章并不复杂&#xff0c;愿诸君耐其心性&#xff0c;忘却杂尘&#xff0c;道有所长&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;个人主页&a…

开源视频剪辑工具推荐

开源视频剪辑和处理工具近年来发展非常迅速&#xff0c;许多工具的功能已经足以媲美甚至超越一些商业软件。以下是一些顶级的开源视频编辑和处理工具&#xff0c;涵盖了从简单易用到专业级别的不同需求。 一、 主要视频编辑软件&#xff08;非线性编辑&#xff0c;NLE&#xf…

第十四届蓝桥杯青少组C++国赛[2023.5.28]第二部分编程题(4、 数独填数)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;char board[9][9];// 检查在 (r,c) 填 num 是否有效 bool isValid(int r, int c, char num) {for (int i 0; i < 9; i) {if (board[r][i] num) return false; // 同行if (board[i][c] num) r…

C语言中奇技淫巧08-使用alloca/__builtin_alloca从栈上分配空间

alloca是什么? alloca 是一个非标准但广泛支持的 C 语言函数&#xff0c;用于在当前函数的栈&#xff08;stack&#xff09;上动态分配内存。 与 malloc 的区别&#xff1a; malloc 在堆&#xff08;heap&#xff09; 上分配内存&#xff0c;需要手动调用 free 释放。alloca 在…

【Markdown转Word完整教程】从原理到实现

Markdown转Word完整教程&#xff1a;从原理到实现 前言 在技术文档编写和学术论文创作中&#xff0c;Markdown因其简洁的语法和良好的可读性而广受欢迎。然而&#xff0c;在实际工作中&#xff0c;我们经常需要将Markdown文档转换为Word格式&#xff0c;以便与同事协作、提交正…