wait和sleep在同步方面的区别

在 Java 中,waitsleep 都用于让线程进入等待状态,但它们在同步操作和线程管理方面有显著区别。以下是它们的主要区别:

1. 所属的类

  • waitObject 类的方法。
  • sleepThread 类的静态方法。

2. 使用场景

  • wait 用于线程间通信,它通常在同步代码块或同步方法中使用,以便让当前线程等待,直到另外一个线程调用同一对象的 notifynotifyAll 方法。
  • sleep 用于让当前线程暂停执行一段时间,通常用于控制线程的执行节奏或模拟延迟。

3. 锁的释放

  • wait 会释放当前线程持有的对象锁,这样其他线程可以获得这个锁并继续执行。
  • sleep 不会释放当前线程持有的任何锁。线程在休眠期间依然持有锁,其他线程无法获得该锁。

4. 重新唤醒

  • wait 需要其他线程调用同一对象的 notifynotifyAll 方法来唤醒。
  • sleep 在指定的时间段结束后自动唤醒。

5. 使用位置

  • wait 必须在同步代码块或同步方法中使用,否则会抛出 IllegalMonitorStateException
  • sleep 可以在任何地方使用,不需要同步块或同步方法。

关于锁的释放,举个下面的代码例子:

package chapter01;class Test {public static void main(String[] args) {try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}class WaitNotifyExample {private final Object lock = new Object();public void waitingMethod() {synchronized (lock) {try {System.out.println(Thread.currentThread().getName() + " is waiting...");lock.wait();System.out.println(Thread.currentThread().getName() + " is resumed.");} catch (InterruptedException e) {e.printStackTrace();}}}public void notifyingMethod() {synchronized (lock) {System.out.println(Thread.currentThread().getName() + " is notifying...");lock.notify();}}public static void main(String[] args) throws InterruptedException {WaitNotifyExample example = new WaitNotifyExample();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {example.waitingMethod();}}, "Thread-1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {example.notifyingMethod();}}, "Thread-2");t1.start();Thread.sleep(1000); // Ensure t1 starts and calls waitt2.start();}
}

在这里插入图片描述

wait 和 notify 示例

  1. WaitNotifyExample 类包含两个方法:waitingMethod 和 notifyingMethod。
  2. waitingMethod 在同步代码块中调用 wait 方法,使当前的线程1等待并释放锁lock。
  3. 因为释放了锁lock,所以线程2能够在 notifyingMethod 方法中进入同步代码块中调用 notify 方法,唤醒等待的线程。
  4. 在 main 方法中,两个线程 t1 和 t2 分别调用 waitingMethod 和 notifyingMethod,演示线程间的通信。

与之对比,sleep方法则不会让线程释放掉当前持有的锁

class SleepExample {private final Object lock = new Object();public void sleepMethod() {synchronized (lock) {try {System.out.println(Thread.currentThread().getName() + " got the lock and is sleeping...");Thread.sleep(2000); // Sleep for 2 secondsSystem.out.println(Thread.currentThread().getName() + " woke up and is releasing the lock.");} catch (InterruptedException e) {e.printStackTrace();}}}public void anotherMethod() {synchronized (lock) {System.out.println(Thread.currentThread().getName() + " got the lock and is doing work.");}}public static void main(String[] args) {SleepExample example = new SleepExample();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {example.sleepMethod();}}, "Thread-1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {example.anotherMethod();}}, "Thread-2");t1.start();try {Thread.sleep(500); // Ensure t1 starts and gets the lock} catch (InterruptedException e) {e.printStackTrace();}t2.start();}
}

在这里插入图片描述

可以发现线程1得到了锁,然后调用了sleep,但是这时候并没有释放掉锁lock,所以线程2必须等到线程1睡醒了执行完代码然后释放锁lock才能进入 anotherMethod 的 synchronized 的同步代码块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/371911.html

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

相关文章

智能家居安防系统教学解决方案

前言 随着科技的不断进步和智能家居概念的深入人心,智能家居安防系统作为智能家居领域的重要组成部分,其重要性日益凸显。智能家居安防系统不仅能够提供环境和人员的监测功能,还能够采取措施降低或避免人员伤亡及财产损失。因此,…

第十一节 动态面板加密解密显示

在原型中我们经常会遇到文件加密与解密显示问题,下面以一个简单案例来说明实现怎么切换明文与密文不同显示方式案例说明; 1、添加动态面板 2、设置加密与不加密 3、添加动作事项 注意为可见时要设置面板状态向前循环,上一项,否则…

网络安全--计算机网络安全概述

文章目录 网络信息系统安全的目标网络安全的分支举例P2DR模型信息安全模型访问控制的分类多级安全模型 网络信息系统安全的目标 保密性 保证用户信息的保密性,对于非公开的信息,用户无法访问并且无法进行非授权访问,举例子就是:防…

如何在 Odoo 16 中对 Many2Many 字段使用 Group by

Many2many 字段与 Many2one 字段类似,因为它们在模型之间建立了新的关系。在Odoo 16中,您无法按 many2many 字段分组,因为可以使用 many2many 记录选择任何记录。当您使用 many2many 字段给出 group by 过滤器时,您将遇到断言错误…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现(6000字以上论文参考)

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

权限维持-Linux-内核加载 LKM-Rootkit 后门

免责声明:本文仅做技术交流与学习... 目录 权限维持-Linux-内核加载 LKM-Rootkit 后门 项目地址: 安装: 隐藏用法: 将 root 权限授予非特权用户 隐藏文件、目录和内核模块 隐藏进程 隐藏 TCP 和 UDP 连接 高级玩法(c/s) 攻击机上(客户端)安装: 设置连接配置 权限维持…

html+js+css做的扫雷

做了个扫雷&#x1f4a3; 88大小 源代码在文章最后 界面 先点击蓝色开局按钮 然后就可以再扫雷的棋盘上玩 0代表该位置没有雷 其他数字代表周围雷的数量 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&qu…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0&#xff0c;var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型&#xff0c;通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

国内采用docker部署open-metadata

背景 最近看看开源的元数据管理项目&#xff0c;比较出名点的有open-metadata、datahub、OpenLineage、atlas。 open-metadata有1千多的贡献者&#xff0c;4.8K的stars&#xff0c;社区现在也比较活跃&#xff0c;支持的数据库类型还蛮多&#xff0c;基本市面上常见的都有支持…

rocketmq实现限流

目录 问题背景 技术方向 方案确认 消息队列&#xff08;√&#xff09; 分布式锁&#xff08;&#xff09; 方案实现 监控方向 业务方向 问题背景 公司邮件服务token有 分钟内超200封的熔断机制&#xff0c;当前token被熔断后&#xff0c;系统发邮件操作会被忽略&…

充电桩一般使用哪种倾倒检测传感器

充电桩通常采用光电倾倒开关作为倾倒检测传感器。这种传感器结构精巧&#xff0c;内置红外发光二极管和光敏接收器&#xff0c;利用光的传输来判断倾倒状态。 光电倾倒开关的设计非常小巧&#xff0c;这使得它可以轻松安装在充电桩的关键部位&#xff0c;无论是垂直、水平还是…

Pandas 学习笔记(四)--CSV文件

CSV文件 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。 读取与写入 读取csv文件 i…

用PlantUML可视化显示JSON

概述 PlantUML除了绘制UML中的一些标准图之外&#xff0c;也可以以图形化的方式显示一些其他图形或数据形式的结构&#xff0c;这其中就包括JSON。 它以一种简单且优美的图形形式&#xff0c;表达了JSON的结构。你可以用它来作为设计JSON数据文件的依据&#xff0c;辅助设计或…

LeetCode刷题之搜索二维矩阵

2024 7/5 一如既往的晴天&#xff0c;分享几张拍的照片嘿嘿&#xff0c;好几天没做题了&#xff0c;在徘徊、踌躇、踱步。蝉鸣的有些聒噪了&#xff0c;栀子花花苞也都掉落啦&#xff0c;今天给他剪了枝&#xff0c;接回一楼来了。ok&#xff0c;做题啦&#xff01; 图1、宿舍…

Python采集京东标题,店铺,销量,价格,SKU,评论,图片

京东的许多数据是通过 JavaScript 动态加载的&#xff0c;包括销量、价格、评论和评论时间等信息。我们无法仅通过传统的静态网页爬取方法获取到这些数据。需要使用到如 Selenium 或 Pyppeteer 等能够模拟浏览器行为的工具。 另外&#xff0c;京东的评论系统是独立的一个系统&a…

【力扣高频题】014.最长公共前缀

经常刷算法题的小伙伴对于 “最长”&#xff0c;“公共” 两个词一定不陌生。与此相关的算法题目实在是太多了 &#xff01;&#xff01;&#xff01; 之前的 「动态规划」 专题系列文章中就曾讲解过两道相关的题目&#xff1a;最长公共子序列 和 最长回文子序列 。 关注公众…

O2OA(翱途)开发平台 V9.1 即将发布,更安全、更高效、更开放

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;O2OA(翱途)平台 V9.1将于7月3日正式发布&#xff0c;届时欢迎大家到O2OA官网部署下载及体验最新版本。新版本我们在如下方面做了更大的努力&#xff1a; 1.扩展数据库兼容性和功能范围&#xff1a;在O2OA…

vue css 链式布局模式

<div class"pp-wrap"> <div class"pp-left"><!--跳活动反思--><div class"even-box" v-for"(item,index) in trackingPtoPLeftList" :key"index" click"jumpReview(item)"><div …

Linux定位CPU飙高代码

Linux定位CPU飙高代码 1、查看服务进程ID 命令 &#xff1a; ps -ef | grep {服务名称} 2、根据进程id查看进程内所有线程 &#xff1a; 命令 &#xff1a; top -Hp {PID} 3、线程ID 转换十六进制 命令&#xff1a; printf “0x%x” {PID} 4、jstack工具跟踪堆栈 命令 &…

水果商城系统 SpringBoot+Vue

1、技术栈 技术栈&#xff1a;SpringBootVueMybatis等使用环境&#xff1a;Windows10 谷歌浏览器开发环境&#xff1a;jdk1.8 Maven mysql Idea 数据库仅供学习参考 【已经答辩过的毕业设计】 项目源码地址 2、功能划分 3、效果演示