多线程(八)

一、wait和notify

                等待        通知        机制

和join的用途类似,多个线程之间随机调度,引入 wait notify  就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略    内核里的线程调度,仍然是无序的.

相当于是在应用程序代码中,让后执行的线程,主动放弃被调度的机会,就可以让先执行的线程,先把对应的代码执行完了.

当有一堆线程要去对同一个对象上锁时,就需要竞争.然后会有一个线程最先拿到这个锁,那么,其他线程就要等待这个线程解锁.但是,有可能会发生,条件不足,导致这个线程要执行的任务没有执行完成,就解锁了.

此时,其他的线程都会参与到锁这个竞争中.

但是,因为第一个进去的并没有完成任务,所以第一个线程也会参与到锁竞争中.

此时,就完全有可能,这个第一个线程他又拿到了锁.

这就会导致一种情况 : 这个线程一直在加锁解锁,但是任务始终没有做完,而其他线程又没法进入这个锁执行任务.

这个情况,称为 "  线程饿死 " .也可以叫做 " 线程饥饿 ".

这种问题属于概率性事件,不想死锁那样,一旦出现了,程序就出问题了.

但是这会极大的影响到其他线程的进行.也就是一种bug.

这个问题的关键在于,第一个线程,发现进行这个操作,无法让自己完成任务,就需要令其阻塞,先让其他线程去竞争这个锁,等到条件可以让第一个线程完成任务了,再借出这个线程的阻塞.

此时,就需要用到wait和notify.

可以使用wait先令其阻塞,等其他线程让条件满足后,再使用notify唤醒.

wait的内部做了三件事 :

1. 释放锁

2. 进入阻塞等待

3. 当其他线程调用notify时,wait解除阻塞,并重新获取到锁.

join和wait的区别 :

join是等待另一个线程结束,才能执行.

wait是等待另一个线程通过notify唤醒才能执行.

阻塞产生的原因 :

1. sleep   TIMED_WAITING

2. join     WAITING

3. synchronized     BLOCKED

wait必须要放到synchronized里面使用,因为wait第一步是释放锁,所以首先要就行加锁.

wait和 sleep   join  是一类,都有可能被interrupt提前唤醒.

notify其实可以不用放到synchornizec里的,不需要先加锁的. ( 但再java中特别约定,要把notify放到synchronized里 )

ps : 操作系统原生api也有wait 和 notify,原生的wait需要先加锁,notify不需要先加锁.

 public static void main(String[] args) {Object A = new Object();Thread t1 = new Thread(()->{synchronized (A){System.out.println("wait之前");try {A.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("wait之后");}});Thread t2 = new Thread(()->{try {Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (A){System.out.println("nofity之前");A.notify();System.out.println("notify之后");}});t1.start();t2.start();}

以上代码运行后,我们就可以发现,再打印" wait之前 "之后,停顿了一会儿才继续打印.

如果有两个wait是同一个对象调用的,此时调用notify会随机唤醒一个.

notifyAll : 唤醒这个对象上所有等待的线程

二、wait和sleep的区别

1 .

wait提供了一个带有超时时间的版本.

sleep也能指定时间

都是时间到就继续执行,借出阻塞了.

2.

wait和sleep都可以被提前唤醒.

wait通过notify唤醒

sleep通过interrupt唤醒

3.

使用wait,最主要的目标是不是到要过多少时间才唤醒.所谓的 " 超时时间 "其实是兜底的.

sleep是用于知道要等待多少时间使用的.虽然也能被提前唤醒,但是这是通过异常环形的,这个操作不应该作为 " 正常的业务流程 "

小结

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

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

相关文章

Pod容器资源限制和探针

目录 一、资源限制 1.Pod和容器的资源请求和限制 2.CPU 资源单位 案例一 案例二 二、健康检查,又称为探针(Probe) 1.探针的三种规则 2.Probe支持三种检查方法 3.探测获得的三种结果 案例一:exec 案例二:htt…

OneMO同行 心级服务:中移物联OneMO模组助力客户终端寒冷环境下的稳定运行

中移物联OneMO模组以客户为中心,基于中国移动心级服务要求,开展“OneMO同行 心级服务 标定一流”高标服务主题活动,升级“服务内容““服务方式”和“服务意识”,为行业客户提供全新的服务体验。 近日,某车载监控设备…

Hive语法学习总结

Hive SQL语法学习总结 hive参数库操作1.创建库2.具体案例3.库的其他操作 表和库的路径演示表的操作创建表插入数据 hive参数 一 hive常用交互命令hive -e sql语句hive -f sql文件 //文件中是sql语句二 参数的设置方式一:在客户端中设置参数(当次有效)set 参数名参…

ACM实训第十七天

Is It A Tree? 问题 考试时应该做不出来,果断放弃 树是一种众所周知的数据结构,它要么是空的(null, void, nothing),要么是一个或的集合满足以下属性的节点之间有向边连接的节点较多。 •只有一个节点,称为根节点,它…

【Crypto】摩丝

文章目录 一、摩斯解题感悟 一、摩斯 很明显莫尔斯密码 iloveyou还挺浪漫 小小flag,拿下 解题感悟 莫尔斯密码这种题还是比较明显的

【董晓算法】竞赛常用知识之图论3(最近公共祖先)

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列(还没学完) 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题&#xff…

智能锁千千万,谁是你的NO.1,亲身实测凯迪仕传奇大师K70旗舰新品

智能锁千千万,谁是你的NO.1。欢迎来到智哪儿评测室,这次我们为大家带来了凯迪仕传奇大师K70系列的一款重磅新品。 在科技的浪潮中,家居安全领域正经历着前所未有的变革。智能锁越来越成为家的安全守护神,以及智能生活的得力助手。…

Android 11 Framework实时监听Activity堆栈变化

核心类 Framework中有一个类SystemActivityMonitoringService专门用于监控Activity堆栈变化,属于隐藏Api,应用侧无法调用。此类位于 packages/services/Car/service/src/com/android/car/SystemActivityMonitoringService.java 方法 void registerTa…

Mysql信息脱敏

类似微信姓名脱敏: SELECT CONCAT( REPEAT(*, CHAR_LENGTH(real_name) -1 ), RIGHT(real_name, 1) ) name from user_info电话号脱敏: SELECT CONCAT(LEFT(mobile_phone, 3), REPEAT(*, 4 ), RIGHT(mobile_phone, 4) ) phone from user_info

大数据Hive中的UDF:自定义数据处理的利器(下)

在上一篇文章中,我们对第一种用户定义函数(UDF)进行了基础介绍。接下来,本文将带您深入了解剩余的两种UDF函数类型。 文章目录 1. UDAF1.1 简单UDAF1.2 通用UDAF 2. UDTF3. 总结 1. UDAF 1.1 简单UDAF 第一种方式是 Simple(简单…

每日一题《leetcode--382.链表随机结点》

https://leetcode.cn/problems/linked-list-random-node/ 这道题我们首先看到题目中的要求:在单链表中随机选取一个链表中的结点,要使每个结点被选取的概率是一样的。 当我们看到随机这两个字时,应该就会想起rand()这个函数。接着我们把使用这…

[晕事]今天做了件晕事35 VM发送给gateway太多ARP,导致攻击检查?

最近遇到一个问题,说网关学不到新起来VM的mac地址,通过tshark抓包发现,VM已经发出去GARP了。而且连续发送了24个GARP。 就认为是网关的问题,为什么没网关没有学到?就让测试同事开网络设备的ticket。 后来听同事说&…

自己搭建内网穿透

本文介绍使用最新版frp搭建内网穿透,最新版本的frp在配置上与之前有很大不同,需要使用.toml文件进行配置。其中主要问题出现在toml文件内部。 一、云服务器配置 下载frp sudo apt update sudo apt install wget wget https://github.com/fatedier/frp…

求出这行英文中最后一个单词的长度

【题目描述】蓝宝看到了一行奇怪的英文,这行英文由若干单词组成,每个单词前后用一些字符*隔开请帮助蓝宝求出这行英文中最后一个单词的长度。【输入格式】 输入一行,就就是蓝宝看到的奇怪的英文。 【输出格式】 输出一行,是个整数…

文旅3d仿真数字人形象为游客提供全方位的便捷服务

在AI人工智能与VR虚拟现实技术的双重驱动下,文旅3D数字代言人正以其独特的魅力,频频亮相于各类文旅场景,为游客带来前所未有的个性化服务体验。他们不仅有趣有品,更能言善道,成为文旅业数字化发展的新亮点。 这些文旅3…

Android 文件加密解密(AES)

private static final String ALGORITHM "AES"; 文件加密 /*** 文件加密* param secretKey 文件加密密钥* param oldFiles 原始文件列表,需要加密的* param newFiles 构造加密后的文件列表*(选择多个或者单个)多个文件加密*/ Re…

我的文章分类合集目录

文章目录 Java相关基础常规问题类Docker类RabbitMQ类分库分表 网络工程相关路由交换、Cisco Packet TracerIP地址 前端相关数据库 Java相关 基础 Java开发规范、项目开发流程 SpringBoot整合MyBatis实现增删改查(简单,详细) SpringBoot整合MybatisPlus(详细&#…

【Muduo】TcpConnection类

Muduo网络库的TcpConnection类代表了TCP连接的一端,即服务器与远程对等端之间的连接。TcpConnection类知道自身和对端的InetAddress、封装了前面讲过的Socket类和Channel类,并且保有管理自己的subLoop指针,还有多种事件处理函数和回调&#x…

【搜索】BFS

#include <iostream> #include <cstring> #include <queue>using namespace std;const int N 110;typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];//存放地图//存每一个点到起点的距离int bfs() {queue< PII > q;q.push({0, 0});m…

C语言什么是位段?其优点是什么?

一、问题 在内存中&#xff0c;1byte 8bit&#xff0c;即 1 字节等于 8 位。位由两个值组成&#xff0c;即 0 和 1 。因此&#xff0c;存储在计算机中的 1 字节&#xff0c;可以看成是8个⼆进制数字&#xff08;0 和1&#xff09;组成的串。了解了内存空间的最⼩单位&#xff…