Java-GuardedBlocks与BusyWaitting忙等待/挂起/阻塞

张开发
2026/4/21 8:16:19 15 分钟阅读

分享文章

Java-GuardedBlocks与BusyWaitting忙等待/挂起/阻塞
现在有这样一个需求两个线程T1T2线程T1会一直等待T2通知当T2通知T1打印我爱武汉汉阳的妹子的时候T1就会打印我爱武汉汉阳的妹子下面是T1的代码它无限轮询boolean a true; while(a) { // 什么都不做 } System.out.println(我爱武汉汉阳的妹子);下面是T2的代码a false;当T2对a进行赋值之后T1就会打印出我爱武汉汉阳的妹子上述这种达到两个甚至多个线程之间通信的方式就叫GuardedBlocks也叫忙等待BusyWaitting现在知道了什么是GuardedBlocks那么来说一说这种做法的缺点就是占用CPU使用率很高因为一直轮询但是又没做任何事情这明显是对CPU的浪费所以对GuardedBlocks使用了一种改进方式这种改进方式是两个进程之间使用两个条件来通讯而不是上述代码中仅仅通过a的值这一个条件来判断改进之后如下1.T1等待T2通知a修改完毕2.T1接到通知之后判断a是否真的修改完毕下面是T1改进后的代码它虽然依旧无限循环但是这只是语义上的体现实际上并不是真的循环多次boolean a true; while(a) { // 添加一个类似wait的方法然后此处将T1阻塞或者挂起 T1.wait(); } System.out.println(我爱武汉汉阳的妹子);下面是T2改进后的代码//首先将afalse a false; //然后通知T1a的值已经修改伪代码类似下面这样 notify(T1)经过改进后的代码可以很大程度上减少CPU的无用消耗注意java中wait底层实现是挂起挂起是CPU的概念即使不存在操作系统CPU执行多任务的时候没有被执行的任务此时的状态就叫做挂起阻塞是线程上的概念而线程是建立在操作系统之上的阻塞可以用挂起来实现也可以用其他方式来实现挂起更贴近底层而阻塞更靠上

更多文章