Java-GuardedBlocks与BusyWaitting忙等待
Guarded[ˈɡɑːrdɪd] 守卫
现在有这样一个需求,两个线程T1,T2,线程T1会一直等待T2通知,当T2通知T1打印"MYS"的时候,T1就会打印MYS
下面是T1的代码,它无限轮询
boolean a = true;
while(a) {// 什么都不做
}
System.out.println("MYS");
下面是T2的代码
a = false;
当T2对a进行赋值之后,T1就会打印出MYS,上述这种达到两个(甚至多个)线程之间通信的方式,就叫GuardedBlocks,也叫忙等待(BusyWaitting)
现在知道了什么是GuardedBlocks,那么来说一说这种做法的缺点,就是占用CPU使用率很高,因为一直轮询,但是又没做任何事情,这明显是对CPU的浪费,所以对GuardedBlocks使用了一种改进方式,这种改进方式是两个进程之间使用两个条件来通讯,而不是上述代码中仅仅通过a的值这一个条件来判断,改进之后如下
1.T1等待T2通知a修改完毕
2.T接到通知之后,判断a是否真的修改完毕
下面是T1改进后的代码,它虽然依旧无限循环,但是这只是语义上的体现,实际上并不是真的循环多次
boolean a = true;
while(a) {// 添加一个类似wait的方法,然后此处将T1阻塞或者挂起T1.wait();
}
System.out.println("MYS");
下面是T2改进后的代码
//首先将a=false
a = false;
//然后通知T1,a的值已经修改,伪代码类似下面这样
notify(T1);
经过改进后的代码,可以很大程度上减少CPU的无用消耗
注意:
java中,wait底层实现是挂起,挂起是CPU的概念,即使不存在操作系统,CPU执行多任务的时候,没有被执行的任务,此时的状态就叫做挂起
阻塞是线程上的概念,而线程是建立在操作系统之上的,阻塞可以用挂起来实现,也可以用其他方式来实现,挂起更贴近底层,而阻塞更靠上
Java-GuardedBlocks与BusyWaitting忙等待相关推荐
- 无锁编程(三) - 忙等待
概念 忙等待可以认为是一种特殊的忙等待 忙等待分类 Peterson算法 xchg解法 TSL解法 自旋锁 Peterson算法 Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个线 ...
- JAVA中实现让程序等待一段时间的方法
JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一: 通过线程的sleep方法. Thread.currentThread().sleep(1000); 在需要程 ...
- 忙等待锁和无忙等待锁
锁的类型 根据锁的实现不同,可以分为忙等待锁和无忙等待锁. (1)忙等待锁 忙等待锁就是当获取不到锁资时,线程就会一直 while 循环,不做任何事情,所以就被成为忙等待锁,也被称为自旋锁. (2)无 ...
- java for循环 等待_java – 主题:忙等待 – 空循环
参见英文答案 > Is this starvation? 2个 在我们的大学课程中,我们学习了Threads并使用" ...
- 学java出来工作会很忙吗?
Java开发行业是众所周知的高薪行业,相信现在正在从事Java开发的同学不少都是因为薪资高才去的,但大家也知道开发行业工作繁重,那么到底学Java出来工作忙不忙呢? Java开发者 首先Java开发行 ...
- Java多线程、主线程等待所有子线程执行完毕、共享资源
1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1 继承Thread类 public class myThread exte ...
- Java多线程开发之------多线程等待
我们在开发过程中,会有这样的场景: 我有两个线程,一个线程去获取一个网络数据,我要等待两个线程回来之后,结合他们的数据去展示到ui里面.怎么实现: 面试被问到这个问题,我的回答是: 设置两个boole ...
- 线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知)
一.wait().notify()和notifyAll() 为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法 //调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对 ...
- oracle 建索引 00054,ora-00054 表被lock导致资源忙等待不能操作案例
数据库版本:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi 操作系统平台:HP-UX 告警日志: more ale ...
最新文章
- Perl 通过SMTP发送正文为HTML格式的邮件
- C#文件封装到Dll
- python os模块system_python 中 os.system 的本质 | 编程知识2
- [react] 类组件和函数式组件有什么区别?
- 视频:如何把应用通过vmc部署到cloud foundry上
- 谈谈VIP漂移那点破事
- Docker从理论到实践(二)------配置Docker镜像源加速器(部分使用效果已不太理想)
- echarts导出为pdf
- 人工神经网络理论及应用,人工智能神经网络论文
- 利用vegas去除视频水印
- html required 无效,html5的input的required使用中遇到的问题及解决方法
- java实现仓储选址_邮局选址问题 (Java代码)并不难
- N1刷ubuntu用上docker 青龙 傻妞机器人和nolan‘Ark
- 马赛克,一生之敌,是时候说再见了【兄弟,借一部说话】
- #define用法【转】
- Carla+ROS1联合仿真环境搭建
- supper的常见错误
- 【每天学点Python】案例三:BMR计算器
- window定时执行html,定时执行、定时执行任务工具 增强Windows自带的计划任务功能...
- SharePoint - PDF file无法打开的解决方案
热门文章
- win10多合一原版系统_手把手教你制作官方原版的WIN10系统安装盘
- 计算机组成微程序操作码怎么写,计算机组成原理学习笔记——控制器
- mysql数据库容量为多少GB_MySQL数据库单表容量有多少 MySQL数据库使用教程
- php curl显示错误信息,php如何调试curl错误信息
- 2017计算机c语言大纲,2017年计算机考研大纲
- 双系统 android 华硕,华硕发布Duet TD300,首款真正Windows+安卓双系统笔记本
- linux svn上传目录_Linux系统下svn更新自动同步到web目录
- @Builder 实际参数列表和形式参数列表长度不同
- node-sass安装报错node-sass@4.12.0 postinstall: `node scripts/build.js`
- 人工智能为失散家人寻找“回家路”