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

sleep和wait

二者区别

所属类:

wait()是定义在Object类中的一个方法。
sleep()是定义在Thread类中的一个静态方法。

用途:

wait()用于线程间的协作,它使得当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法。sleep()用于让当前线程暂停执行一段时间,它并不涉及线程间的通信。

锁的释放与持有:

二者都可以将线程由运行态变为阻塞态,当线程调用wait()时,它会释放当前对象的监视器(锁),允许其他线程访问该对象的同步代码块。当线程调用sleep()时,它不会释放锁,线程仍然持有它所拥有的锁。因此,其他线程无法进入同步的代码块,直到sleep()的时间结束。

中断响应:

wait()可以被其他线程通过调用interrupt()方法中断,抛出InterruptedException。
sleep()也可以被中断,但会抛出InterruptedException,并且此时会结束睡眠状态。
调用方式:

调用方式

wait()必须在同步代码块或同步方法中调用。
sleep()可以在任何地方调用,不需要持有锁。

wait作用范围

wait和notify一定要在同步代码块/方法中才能使用原因是

  • 从功能实现角度每个对象在 Java 中都有一个监视器锁。当一个线程进入同步代码块或方法时,它会获取该对象的锁。只有持有对象锁的线程才能调用锁对象的wait()、notify() 或 notifyAll() 方法,使得当前线程进入等待状态并释放锁
  • 从线程安全角度考虑,wait() 方法使线程进入等待状态,并释放对象的锁,这样其他线程可以进入同步代码块。而 notify() 和 notifyAll() 方法用于唤醒在该对象上等待的线程。为了确保线程之间的协调和数据的一致性,这些操作必须在一个已同步的上下文中进行。如果没有加锁的保护,可能会导致不一致的状态和难以追踪的并发问题

wait的使用场景


http://www.kler.cn/a/526807.html

相关文章:

  • origin如何在已经画好的图上修改数据且不改变原图像的画风和格式
  • 【AI】Deepseek本地部署探索,尝试联网搜索
  • 蓝桥杯之c++入门(一)【C++入门】
  • 【自学笔记】计算机网络的重点知识点-持续更新
  • Java---猜数字游戏
  • [论文总结] 深度学习在农业领域应用论文笔记14
  • 基于遗传优化GRNN和Hog特征提取的交通标志识别算法matlab仿真
  • Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
  • 1.27刷题记录
  • 【leetcode练习·二叉树】计算完全二叉树的节点数
  • Git进阶之旅:Git Hub注册创建仓库
  • 解决运行npm时报错
  • 面向对象编程(OOP)基础:类与对象
  • 线性回归简介:从理论到应用
  • 01. 计算机系统
  • C++ 中的引用(Reference)
  • 第十一章 F - H 开头的术语
  • 数据结构与算法之哈希表: LeetCode 1797. 设计一个验证系统 (Ts版)
  • 深入剖析 Docker 的镜像分层存储机制
  • jhat命令详解
  • 3.拼正方形python解法——2024年省赛蓝桥杯真题
  • 第28章 星骗计划的开篇
  • 25.Word:学生成绩管理系统【8】
  • plot(a_star_path(:, 1), a_star_path(:, 2), ‘r-‘, ‘LineWidth‘, 2);
  • 实验七 JSP内置对象II
  • 力扣【98. 验证二叉搜索树】Java题解(容易写错的题)