wait和sleep在同步方面的区别

news2024/9/22 11:35:31

在 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() {
            @Override
            public void run() {
                example.waitingMethod();
            }
        }, "Thread-1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                example.notifyingMethod();
            }
        }, "Thread-2");

        t1.start();
        Thread.sleep(1000); // Ensure t1 starts and calls wait
        t2.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 seconds
                System.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() {
            @Override
            public void run() {
                example.sleepMethod();
            }
        }, "Thread-1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public 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.coloradmin.cn/o/1907942.html

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

相关文章

鸿蒙开发小案例(名片管理))

鸿蒙开发小案例(名片管理) 1、页面效果1.1 初始页面1.2 点击名片展开1.3 点击收藏1.4 点击编辑按钮 2、实现代码2.1 DataModel.ets2.2 RandomUtil.ets2.3 ContactList.ets 1、页面效果 1.1 初始页面 1.2 点击名片展开 1.3 点击收藏 1.4 点击编辑按钮 2、…

第二证券:资金抱团“高股息”,超三成A股年内创历史新低!

A股商场行情冰火两重天。 “预制菜榜首股”跌破发行价 7月8日,味知香盘中最低跌至19.26元/股,股价跌破发行价,并创前史新低。揭露资料显现,公司是集研发、生产、销售为一体的半成品菜企业,现在具有8大产品系列&#…

短视频矩阵系统源代码开发---多种剪辑逻辑再次升级

揭秘AI短视频运营秘籍,轻松涨粉! 1、数据管理方面,我们提供了全面的账号及视频Top 10的数据统计服务。 2、在AI视频创意制作领域,我们采用原创视频批量剪辑、阶乘算法和去重原理,以提升内容的独特性和吸引力。 3、同…

腾讯发布2024大模型十大最新趋势!

近日,在2024世界人工智能大会上,腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前,这一报告正在AI产业界各大社群快速传播。 报告中,腾讯研究院试图通过10个关键性的趋势,去理解全世界范围内正…

【Ubuntu】windows和Linux文件互传、共享

【Ubuntu】windows和Linux文件互传、共享 一、FTP、SAMBA、NFS简介 FTP: File Transfer Protocol(文件传输协议) SAMBA: 基于SMB(Server Message Block服务器消息块)协议的软件实现 NFS: Network File System(网络文件系统) 二、Linux 共享文…

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候,遇到如下问题: 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

算法013:水果成篮

水果成篮. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/fruit-into-baskets/ 这道题题目很长,仔细阅读过后,我们其实可以简化成&#xff…

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进 1月2月3月4月5月6月7月8月9月10月11月12月 《365日创意文案》WRITES PUBLISHING,一些日常,是烟火,也是幸福的印记。 当下也…

昇思学习打卡-8-FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域,是一种端到端的分割方法,是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

c向c++的过渡

目录 1.不同版本的hello word! 2.namespace和::域作用限定符以及using 2.1 namespace 2.2:: 2.3using用于展开域 3.C输入和输出 4.缺省参数 5.重载 6.引用 1.不同版本的hello word! 还记得第一次写C语…

【JavaWeb程序设计】JSP访问数据库(三)

目录 一、使用表格展示数据库中stuinfo表中的个人信息 1. 建表(stuinfo) 2. Bean对象 3. 显示所有学生信息 3.1 DAO层 3.2 Service层 3.3 Servlet 3.4 主页面(home.jsp) 3.5 运行截图 4. 新增学生信息 4.1 add.jsp 4.2…

C语言相关内容模块

C语言相关内容模块 1、函数指针定义方式 1、函数指针定义方式 函数指针的具体用法

推荐3款免费电脑工具

Tools-Web Tools-Web是一个在线工具箱,提供丰富的工具和功能,适用于日常工作和学习。根据用户评价,Tools-Web的工具种类丰富且操作简单,是日常工作和学习的好帮手。该工具箱涵盖了开发运维、文本处理、图片处理、图表处理、随机工…

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义 《我有个拥抱,你要不要》作者一天到晚气fufu,挺有愛的小漫画,适合用来看图说话锻炼小语言,我看的很快乐也写得很痛快&#xf…

【C++深度探索】继承机制详解(二)

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:大耳朵土土垚的博客 &#x1…

linux主机离线安装python3环境

一、下载好python版本 Index of /ftp/python/https://www.python.org/ftp/python/ 二、创建文件夹 mkdir /home/python/ 三、上传到主机 四、解压 # 解压xz得到tar包 xz -d Python-3.9.8.tar.xz # 解压tar包 tar -xvf Python-3.9.8.tar 五、指定安装路径 # 进入解压后的…

论文解析——Full Stack Optimization of Transformer Inference: a Survey

作者及发刊详情 摘要 正文 主要工作贡献 这篇文章的贡献主要有两部分: 分析Transformer的特征,调查高效transformer推理的方法通过应用方法学展现一个DNN加速器生成器Gemmini的case研究 1)分析和解析Transformer架构的运行时特性和瓶颈…

SketchUp如何阵列?

sketchup如何阵列?请看下面方法。 方法 打开SketchUp。 以默认人物为例。 按M,选中人物,再按住Ctrl移动鼠标(不要点击鼠标键) 按键盘数字键输入距离,按回车,不要动鼠标。 按*10设置阵列数。 按…

C++视觉开发 四.手势识别

本章记录传统手势识别,在表示0-5六个数值时的识别问题。例如识别剪刀石头布,手势,以及其表示的动作。在识别时将手势中的凹陷区域称为凸缺陷,其个数作为识别的重要依据。 需要注意,在凸缺陷个数为0时,无法…

如何解决模型的灾难性遗忘问题?清华大学提出新方法

获取本文论文原文PDF,请在公众号【AI论文解读】留言:论文解读 探索连续学习中的新方法 在人工智能领域,尤其是在语言模型(LM)的发展过程中,连续学习(CL)始终是一个挑战。传统的学习…