并发编程-线程等待唤醒机制

目录

前言

​编辑

线程等待和唤醒的方法 

wait() 方法:

notify() 方法:

注意事项和建议:

我的其他博客


前言

程等待唤醒机制是多线程编程中用于线程之间协调和通信的一种机制。在多线程环境中,有时候一个线程需要等待某个条件满足,而另一个线程则需要在某个条件满足时通知其他线程。

线程等待和唤醒的方法 

在Java中,线程等待和唤醒的方法通常是通过 Object 类的 wait(), notify(), 和 notifyAll() 方法来实现的。这些方法必须在同步块或同步方法中使用,因为它们依赖于对象的锁机制。

wait() 方法:

  • 使当前线程进入等待状态,同时释放对象的锁。
  • 调用 wait() 后,线程会等待被其他线程通过 notify()notifyAll() 方法唤醒。
  • 在等待期间,线程可以被中断(通过 interrupt() 方法),也可以在等待一定时间后自动唤醒(通过带有超时参数的 wait(long timeout) 方法)。
    synchronized (sharedObject) {
        while (conditionIsNotMet) {
            sharedObject.wait();
        }
        // 执行等待后的操作
    }
    

    notify() 方法:

  • 唤醒在此对象上等待的一个线程。
  • 如果有多个线程在等待,notify() 方法会选择其中一个线程唤醒,但是无法确定是哪一个。
  • 调用 notify() 后,被唤醒的线程将尝试重新获得对象的锁。
    synchronized (sharedObject) {
        // 满足条件后,通知等待的线程
        sharedObject.notify();
    }
    

    notifyAll() 方法:

  • 唤醒在此对象上等待的所有线程。
  • 使用 notifyAll() 会唤醒所有等待的线程,这样它们都有机会争夺对象的锁。
    synchronized (sharedObject) {
        // 满足条件后,通知等待的所有线程
        sharedObject.notifyAll();
    }
    

    在上述代码中,sharedObject 是共享对象,多个线程在这个对象上进行同步。wait() 方法会使线程释放对象的锁,然后等待其他线程唤醒。notify()notifyAll() 方法用于在满足某个条件时通知等待的线程,使其重新竞争锁。

注意事项和建议:

  1. 防止虚假唤醒: 在等待的时候,通常需要在循环中检查条件,以防止虚假唤醒。

    synchronized (sharedObject) {
        while (conditionIsNotMet) {
            sharedObject.wait();
        }
        // 某个条件满足后的操作
    }
    

  2. 调用顺序: 调用 wait() 方法的线程会释放对象的锁,而调用 notify()notifyAll() 的线程会尝试重新获得对象的锁。

  3. 合理使用 notifyAll() 在使用 notifyAll() 时,需要考虑唤醒的线程是否真的需要被唤醒,以避免不必要的性能开销。

  4. 避免死锁: 当设计线程等待唤醒机制时,需要注意避免死锁的情况,确保线程能够正确释放和获取锁。

  5. 示例代码:

    class SharedResource {
        private boolean condition = false;
    
        synchronized void waitForCondition() throws InterruptedException {
            while (!condition) {
                wait();
            }
            // 某个条件满足后的操作
        }
    
        synchronized void signalCondition() {
            condition = true;
            notifyAll();  // 或 notify(),唤醒等待的线程
        }
    }
    

    上述代码中,waitForCondition 方法用于等待条件满足,而 signalCondition 方法用于设置条件并唤醒等待的线程。这是一个简单的示例,实际应用中,需要根据具体场景设计合适的等待唤醒机制。

我的其他博客

简单介绍一些其他的树-CSDN博客

认识二叉树(详细介绍)-CSDN博客

正则表达式详细讲解-CSDN博客

低代码开发:创新之道还是软件开发的捷径?-CSDN博客

HTTP与HTTTPS的区别-CSDN博客

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客

在多线程中sleep()和wait()的区别(详细)-CSDN博客

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

堆排序详细讲解(一文足矣JAVA)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】Doris 架构

Doris 架构 Doris 的架构很简洁,只设 FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于外部组件,方便部署和运维,FE、BE 都可线性扩展。 ✅ Frontend(FE&#xff0…

C++_类的定义和使用

目录 1、类的引用 1.1 类的成员函数 1.2 类成员函数的声明和定义 2、类的定义 2.1 类的访问限定(封装) 3、类重名问题 4、类的实例化 4.1 类的大小 5、隐含的this指针 5.1 空指针问题 结语: 前言: C的类跟c语言中的结…

Standoff 12 网络演习

在 11 月 21 日至 24 日于莫斯科举行的 "Standoff 12 "网络演习中,Positive Technologies 公司再现了其真实基础设施的一部分,包括软件开发、组装和交付的所有流程。安全研究人员能够在安全的环境中测试系统的安全性,并尝试将第三方…

GO闭包实现原理(汇编级讲解)

go语言闭包实现原理(汇编层解析) 1.起因 今天开始学习go语言,在学到go闭包时候,原本以为go闭包的实现方式就是类似于如下cpp lambda value通过值传递,mutable修饰可以让value可以修改,但是地址不可能一样value通过引用传递,但是在其他地方调用时,这个value局部变量早就释放,…

低多边形植物模型法线贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

深度学习在人体动作识别领域的应用:开源工具、数据集资源及趋动云GPU算力不可或缺

人体动作识别检测是一种通过使用计算机视觉和深度学习技术,对人体姿态和动作进行实时监测和分析的技术。该技术旨在从图像或视频中提取有关人体姿态、动作和行为的信息,以便更深入地识别和理解人的活动。 人体动作识别检测的基本步骤包括: 数…

web279(s2-001)

目前java小白一个,主要是学学别人的思路 进入题目,登录框一个 抓包也没发现什么东西 网上说是struts2框架 Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架 判断是不是基于struts2的一些方法: 1.通过页面回显的错误消息来判断…

MySQL一行记录是怎么存储的?

文章目录 MySQL 一行记录是怎么存储的?MySQL 的数据存放在哪个文件?表空间文件结构 InnoDB行格式有哪些Compact行格式varchar(n) 中 n 最大取值为多少?行溢出后,MySQL是怎么处理的? MySQL 一行记录是怎么存储的&#x…

IDEA 出现问题:git提交commit时Perform code analysis卡住解决方案

问题 git提交commit时Perform code analysis卡住很久 解决方案一 1、打开 IntelliJ IDEA,进入 File -> Settings(或者使用快捷键 CtrlAltS)。 2、在弹出的 Settings 窗口中,找到 Version Control -> Commit Dialog 选项…

Flink 有状态流式处理

传统批次处理方法 【1】持续收取数据(kafka等),以window时间作为划分,划分一个一个的批次档案(按照时间或者大小等); 【2】周期性执行批次运算(Spark/Stom等)&#xff1b…

机器学习---Adaboost算法

1. Adaboost算法介绍 Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然 后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。Adaboost算法本身…

CSS学习

CSS学习 1. 什么是css?2.css引入方式2.1 内嵌式2.2 外联式2.3 行内式2.4 引入方式特点 3. 基础选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 1. 什么是css? 2.css引入方式 2.1 内嵌式 2.2 外联式 提示: 需要在html文件中link目标样式表; 2.3 行内式 注意:…

【EventBus】EventBus源码浅析

二、EventBus源码解析 目录 1、EventBus的构造方法2、订阅者注册 2.1 订阅者方法的查找过程2.2 订阅者的注册过程1. subscriptionsByEventType 映射:2. typesBySubscriber 映射:2.3 总结订阅者的注册过程 3、事件的发送 3.1 使用Post提交事件3.2 使用p…

【STM32】DMA直接存储器存取

1 DMA简介 DMA(Direct Memory Access)直接存储器存取 可以直接访问STM32的存储器的,包括运行SRAM、程序存储器Flash和寄存器等等 DMA可以提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节…

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#x…

二蛋赠书十一期:《TypeScript入门与区块链项目实战》

前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…

【C 剑指offer】有序整型矩阵元素查找 {杨氏矩阵}

目录 题目内容: 思路: 图形演示: 复杂度分析 C源码: /** *************************************************************************** ******************** ********************* ******…

DWA(dynamic window approach)算法学习

系列文章目录 A*算法学习-CSDN博客 弗洛伊德算法(Floyd)和路径平滑弗洛伊德算法(Smooth Floyd)学习-CSDN博客 D*算法学习-CSDN博客 目录 系列文章目录 前言 搜索空间 —减小速度搜索空间 优化过程 —最大化目标函数 算法实…

《洛谷深入浅出》斯特林数

斯特林数被分为三种,但我们这只介绍两种。即第一类斯特林数,和第二类斯特拉数。 第一类斯特林数指的是: 将n个不同元素,变成m个圆排列的方案数量。第一类斯特林数,分为有符号和无符号。通常我们只研究无符号斯特林数&…

Layui深入

1、代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>注册页面</title> <style> .container { max-width: 600px; margin: 0 auto; padding: 20px; …