wait/notify 的原理

news2024/10/7 4:32:37

目录

一、wait/notify 的原理

二、虚假唤醒(错误唤醒)

三、使用 wait/notify 的正确姿势


一、wait/notify 的原理

1. owner 线程发现有条件不满足,调用 wait() 进入 Monitor 的 WaitSet 等待,切换为 Waiting 状态

2. 问题:wait 释放锁之后会唤醒 blocked 中的线程吗?

3. Blocked 中的线程会在释放锁的时候被唤醒

4. Waiting 中的线程会在 owner 线程调用 notify()/notifyAll() 时被唤醒,唤醒之后并不是直接获取锁,而是进入 EntryList 阻塞,重新竞争锁,竞争成功才能获取

5. API

  • wait():只有已经获得了 Monitor 的 owner 线程才能调用 wait 方法进入 waitset,否则抛异常 IllegalMonitorStateException(先 synchonized(lock),再调用 lock.wait(); )== 内部调用 wait(0),表示无限等待
  • wait(long timeout):有时限的等待,在一段时间内,如果没有其他线程 notify 它,它就会自动醒来继续执行
  • wait(long timeout, int nanos):并不是真的能精确到纳秒,而是将 timeout++,实际调用的还是 wait(timeout);
  • notify():只唤醒 waitset 中的一个线程,也要先获取锁 synchronized(lock),才能调用 notify 和 notifyAll
  • notifyAll():唤醒 waitset 中的所有线程

6. wait(long timeout) vs sleep(long timeout)

  • sleep 是 Thread 的静态方法,wait 是 Object 类的方法
  • sleep 不需要和 synchronized 配合使用,但 wait 需要配合 synchronized
  • sleep 不会释放锁,wait 会释放锁
  • 共同点:线程状态都是 TIMED_WAITING,有时限等待

二、虚假唤醒(错误唤醒)

1. notify 是随机挑选一个线程唤醒,该线程所需要的条件有可能还没有满足,但是被错误唤醒了,还是不能执行

2. notifyAll 会唤醒所有在 obj.wait 的线程,每个线程再去检查自己的条件是否满足,条件满足的线程可以继续执行,但是条件不满足的线程也被唤醒了

3. 被 notifyAll 唤醒的线程判断是否满足,不满足则进入下一轮的 wait

三、使用 wait/notify 的正确姿势

synchronized (lock) {
    while (条件不满足) {
        lock.wait();
    }
    // 开始工作
}

// 另一个线程
synchronized (lock) {
    lock.notifyAll();
}

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

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

相关文章

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!! 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下,你开了一家便利店,店里…

Springboot Mybatis 多数据源配置以及使用

在Spring Boot中配置MyBatis的多数据源是一个常见需求,尤其是在需要连接多个数据库时,下面是详细的步骤指南。 引入依赖 首先,在你的pom.xml文件中添加Spring Boot、MyBatis和数据库连接的相关依赖。例如,如果你使用的是MySQL数…

Boosted Trees 介绍

Boosted Trees 介绍 文章目录 Boosted Trees 介绍监督学习要素模型和参数目标函数:训练损失 正则化为什么介绍一般原则? 决策树集成Tree BoostingAdditive TrainingModel ComplexityThe Structure ScoreLearn the tree structure 关于 XGBoost 的最后话…

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨…

某麦网自动刷新抢票脚本——手机端(高级版)

某麦网自动刷新抢票脚本——电脑端 小白操作-抵制黄牛–需要更好用更高级关注获取 如何用Python自动抢大麦网演出票? 在数字化时代,购票已经成为我们生活的一部分,无论是音乐会、话剧、体育赛事还是各种展览,抢票几乎成了一项“…

【隐私计算】对SIMD编码的粗浅理解

首先需要知道,同态加密是在多项式上进行的,基于RLEW的整体流程如下: 将单个数编码到一个N阶(N项)多项式中,多项式系数的利用率极低。而在神经网络中,我们需要计算的东西往往是一个很大的矩阵/te…

使用 nvm 管理 Node 版本及 pnpm 安装

文章目录 GithubWindows 环境Mac/Linux 使用脚本进行安装或更新Mac/Linux 环境变量nvm 常用命令npm 常用命令npm 安装 pnpmNode 历史版本 Github https://github.com/nvm-sh/nvm Windows 环境 https://nvm.uihtm.com/nvm.html Mac/Linux 使用脚本进行安装或更新 curl -o- …

可用的微信小程序抓包方式(Charles + bp)

扫码领资料 获网安教程 前言 接到对公司小程序进行渗透的任务,尝试了网上几种对小程序抓包的方式(BurpProxifier、Burp安卓模拟器等)都无法完成抓包,可能已经失效,结合不同的文章尝试了bpCharles,成功抓包…

支持内嵌H5页面,谈谈微信小程序的应用场景

目录 一、微信小程序介绍二、什么是内嵌H5页面三、小程序内嵌H5页面的如何交互四、微信小程序的应用场景 一、微信小程序介绍 微信小程序是一种基于微信平台的轻量级应用,它无需下载安装,用户只需通过微信扫一扫或搜索即可快速打开使用。与传统的APP相比…

新火种AI|苹果要将苹果智能做成AI时代的APP Store?

作者:一号 编辑:美美 苹果还是想要自己做AI时代的“APP Store”。 自从去年开始落了队,苹果现在AI上开始高歌猛进。今年WWDC上展示的AI产品和与OpenAI的合作只是开始。有消息称,苹果正与Meta等AI巨头展开深入合作,这…

二、安装虚拟机

本篇来源:山海同行 本篇地址:https://shanhaigo.cn/courseDetail/1805875642621952000 本篇资源:以整理到-山海同行 一、官网下载centos7 1. 进入CentOS 官方网站 官方网站:https://www.centos.org/download/ 2. 选择iso 点击下…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯,每次项目的数据库都是在线上创建,Navicat 连接线上数据库进行处理,最近有一个项目需要二次升级,发现老项目部署的服务器到期了,完蛋,数据库咩了!!!…

IP地址查询和代理服务器:双重保护隐私

随着网络应用的日益普及,我们的个人信息和数据安全面临前所未有的挑战。在此背景下,IP地址查询和代理服务器成为保护个人隐私和网络安全的两大关键工具。本文将从IP地址查询的原理和应用出发,深入剖析代理服务器在网络隐私保护中的作用&#…

一个分析电路图的好助手

GPT。 最进分析电路图的时候发现GPT支持读取图片功能: 还别说,分析的很有道理。 此外,它还可以分析芯片的引脚功能,辅助电路分析: AB胶:粘的非常牢固,需要A和B两种胶混合使用。

vue+go实现web端连接Linux终端

vuego实现web端连接Linux终端 实现效果 实现逻辑1——vue 依赖包 "xterm": "^5.3.0","xterm-addon-attach": "^0.9.0","xterm-addon-fit": "^0.8.0"样式和代码逻辑 <template><a-modalv-model:visib…

《分析模式》漫谈08-单继承不是“唯一继承”

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》第2章这一段&#xff1a; 划线处的single inheritance&#xff0c;2004中译本的翻译&#xff1a; 翻译为“单继承”&#xff0c;是正确的。 2020中译本的翻译&#xff1a…

【人工智能】—XGBoost、CatBoost、LightGBM算法构建信用卡欺骗识别模型

引言 在金融领域&#xff0c;信用卡欺诈行为一直是银行和金融机构面临的一大挑战。随着电子商务的快速发展&#xff0c;信用卡欺诈事件的数量和复杂性都在不断增加。据统计&#xff0c;全球每年因信用卡欺诈造成的损失高达数十亿美元。因此&#xff0c;开发有效的欺诈检测系统…

i-Health

技术栈&#xff1a;HTMLCSSJavascriptPHP

同步模式之保护性暂停模式

1. Guarded Suspension&#xff1a;一个线程需要等待另一个线程的执行结果 2. 理解 一个线程需要将结果传递给另一个线程&#xff0c;将这两个线程关联到到同一个 GuardedObject 如果需要源源不断地传递结果&#xff0c;需要使用消息队列&#xff08;生产者-消费者模型&…

SpringBoot(二)SpringBoot多环境配置

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot&#xff08;一&#xff09;创建一个简单的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多环境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…