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忙等待相关推荐

  1. 无锁编程(三) - 忙等待

    概念 忙等待可以认为是一种特殊的忙等待 忙等待分类 Peterson算法 xchg解法 TSL解法 自旋锁 Peterson算法 Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个线 ...

  2. JAVA中实现让程序等待一段时间的方法

    JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一: 通过线程的sleep方法. Thread.currentThread().sleep(1000); 在需要程 ...

  3. 忙等待锁和无忙等待锁

    锁的类型 根据锁的实现不同,可以分为忙等待锁和无忙等待锁. (1)忙等待锁 忙等待锁就是当获取不到锁资时,线程就会一直 while 循环,不做任何事情,所以就被成为忙等待锁,也被称为自旋锁. (2)无 ...

  4. java for循环 等待_java – 主题:忙等待 – 空循环

    参见英文答案 > Is this starvation?                                    2个 在我们的大学课程中,我们学习了Threads并使用" ...

  5. 学java出来工作会很忙吗?

    Java开发行业是众所周知的高薪行业,相信现在正在从事Java开发的同学不少都是因为薪资高才去的,但大家也知道开发行业工作繁重,那么到底学Java出来工作忙不忙呢? Java开发者 首先Java开发行 ...

  6. Java多线程、主线程等待所有子线程执行完毕、共享资源

    1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1  继承Thread类 public class myThread exte ...

  7. Java多线程开发之------多线程等待

    我们在开发过程中,会有这样的场景: 我有两个线程,一个线程去获取一个网络数据,我要等待两个线程回来之后,结合他们的数据去展示到ui里面.怎么实现: 面试被问到这个问题,我的回答是: 设置两个boole ...

  8. 线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知)

    一.wait().notify()和notifyAll() 为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法 //调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对 ...

  9. oracle 建索引 00054,ora-00054 表被lock导致资源忙等待不能操作案例

    数据库版本:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi 操作系统平台:HP-UX 告警日志: more   ale ...

最新文章

  1. Perl 通过SMTP发送正文为HTML格式的邮件
  2. C#文件封装到Dll
  3. python os模块system_python 中 os.system 的本质 | 编程知识2
  4. [react] 类组件和函数式组件有什么区别?
  5. 视频:如何把应用通过vmc部署到cloud foundry上
  6. 谈谈VIP漂移那点破事
  7. Docker从理论到实践(二)------配置Docker镜像源加速器(部分使用效果已不太理想)
  8. echarts导出为pdf
  9. 人工神经网络理论及应用,人工智能神经网络论文
  10. 利用vegas去除视频水印
  11. html required 无效,html5的input的required使用中遇到的问题及解决方法
  12. java实现仓储选址_邮局选址问题 (Java代码)并不难
  13. N1刷ubuntu用上docker 青龙 傻妞机器人和nolan‘Ark
  14. 马赛克,一生之敌,是时候说再见了【兄弟,借一部说话】
  15. #define用法【转】
  16. Carla+ROS1联合仿真环境搭建
  17. supper的常见错误
  18. 【每天学点Python】案例三:BMR计算器
  19. window定时执行html,定时执行、定时执行任务工具 增强Windows自带的计划任务功能...
  20. SharePoint - PDF file无法打开的解决方案

热门文章

  1. win10多合一原版系统_手把手教你制作官方原版的WIN10系统安装盘
  2. 计算机组成微程序操作码怎么写,计算机组成原理学习笔记——控制器
  3. mysql数据库容量为多少GB_MySQL数据库单表容量有多少 MySQL数据库使用教程
  4. php curl显示错误信息,php如何调试curl错误信息
  5. 2017计算机c语言大纲,2017年计算机考研大纲
  6. 双系统 android 华硕,华硕发布Duet TD300,首款真正Windows+安卓双系统笔记本
  7. linux svn上传目录_Linux系统下svn更新自动同步到web目录
  8. @Builder 实际参数列表和形式参数列表长度不同
  9. node-sass安装报错node-sass@4.12.0 postinstall: `node scripts/build.js`
  10. 人工智能为失散家人寻找“回家路”