多线程六-线程通信之Condition使用与设计猜想

海上生明月,天涯共此时。愿大家在这个团圆的夜晚,收获满满的温馨和喜悦,团圆美满,中秋快乐!
月满中秋

使用示例

ConditionDemoAwait :开始之后加锁,阻塞并释放锁

package com.caozz.demo5.concurrent;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class ConditionDemoAwait implements Runnable{private Lock lock;private Condition condition;public ConditionDemoAwait(Lock lock, Condition condition){this.condition = condition;this.lock = lock;}@Overridepublic void run() {System.out.println("begin---ConditoiopnDemoAwait--");lock.lock();try{condition.await();System.out.println("end---ConditoiopnDemoAwait--");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}
  • ConditionDemoSinal :开始之后唤醒,此时并不会释放锁,所以会先结束,才会释放锁
package com.caozz.demo5.concurrent;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class ConditionDemoSinal implements Runnable{private Lock lock;private Condition condition;public ConditionDemoSinal(Lock lock, Condition condition){this.condition = condition;this.lock = lock;}@Overridepublic void run() {System.out.println("begin---ConditoiopnDemoSinal--");lock.lock();try{//让当前线程阻塞,相当于Object.notify()condition.signal();System.out.println("end---ConditoiopnDemoSinal--");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

测试:

package com.caozz.demo5.controller;import com.caozz.demo5.concurrent.ConditionDemoAwait;
import com.caozz.demo5.concurrent.ConditionDemoSinal;
import com.caozz.demo5.concurrent.Consumer;
import com.caozz.demo5.concurrent.Producer;import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Test {public static void main(String[] args) throws InterruptedException {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();ConditionDemoAwait await = new ConditionDemoAwait(lock, condition);ConditionDemoSinal sinal = new ConditionDemoSinal(lock, condition);new Thread(await).start();Thread.sleep(10);new Thread(sinal).start();}
}

结果:
线程启动:await启动,执行开始后加锁,并阻塞,此时signal开始,并执行唤醒,然后signal结束,释放锁,被唤醒得await结束
如果启动不加sleep,可能会sinal先启动,那么sinal开始,唤醒,结束,然后await执行,阻塞,然后就会一直阻塞,无法结束,因为没有被唤醒

begin---ConditoiopnDemoAwait--
begin---ConditoiopnDemoSinal--
end---ConditoiopnDemoSinal--
end---ConditoiopnDemoAwait--

设计猜想

  • 作用:实现线程的阻塞与唤醒
  • 前提条件: 必须先要获得锁
  • await、signal、signalall
    • await:让线程阻塞,并且释放锁
    • signal:唤醒阻塞的线程

  • 加锁的操作,必然会涉及到AQS的阻塞队列
  • await释放锁时,AQS队列中不存在已经释放锁的线程,那么被释放的线程去到了哪里?
  • 唤醒被阻塞的线程:被阻塞的线程在哪里?
    经过上面的思考,应该可以想到,通过await方法释放的线程,必须要有一个地方来存储,同时,阻塞的线程,是通过AQS还是单独地方来存储呢?

Condition等价于wait/notify
Condition是JUC里面得实现,所以不能使用wait/notify ,锁的实现不同。

欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

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

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

相关文章

[GXYCTF2019]BabyUpload 1

打开靶机,上传文件抓包 后缀不能带ph,大小写也无法绕过,意味着phtml后缀也无法上传对后缀只过滤ph,我们转变思路上传图片马,用.htaccess使图片马以php格式打开 上传图片马上传失败,试一试过滤了哪些字符 文件内容过滤了<?我们尝试另一种写法后成功上传<script lan…

DeepinV23安装Dotnet8

步骤: 第一步: 1.下载压缩包,2安装配置 第二步: 2准备工作:激活ROOT账号,重置密码解压目录:/home/bizuser/soft/dotnet/dotnet81.下载 直接🔗 https://download.visualstudio.microsoft.com/download/pr/14951030-5b4e-45ce-af0b-3d4aa613a70b/25acaeb050bbba6950a559…

高级Java程序员必备的技术点:你准备好了吗?

在Java编程的世界里,成为一名高级程序员不仅需要深厚的基础知识,还需要掌握一系列高级技术和最佳实践。这些技术点是通向技术专家之路的敲门砖,也是应对复杂项目挑战的利器。本文将探讨高级Java程序员必备的技术点,帮助你自我提升,迈向更高的职业巅峰。深入理解Java虚拟机…

无限debugger的解决----(一)

在尝试打开控制台时,遇到了这个问题,页面陷入无限debuuger。尝试(一)在debugger这一行点击Never pause here 也就是从不在此处暂停,但之后发现没用,关掉一个又出现一个。之后我又尝试了设置进入断点的条件,这个可以在调试过程中,期望某个变量的值大于某个具体的值的时候才停下来…

【USB3.0协议学习】Topic3三种Reset Events分析

USB3.0中的三种Reset Events 1. PowerOn Reset PowerOn Reset被用来代指上电复位,当一个device接入到root hub或者外置hub的时候,该device检测到Vbus信号从无效变为有效,会自动执行复位。(注意,self powered device不通过Vbus供电,但是Vbus发生转变的时候它同样会执行复位…

02策略模式

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化1. 案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费**- 正常原价收费 - 八折收费 - 满300返100 2. 策略模式结构- 抽象策略类(Stategy):声明算法…

三、浅层神经网络

1、神经网络概览什么是神经网络?如下图:神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多一层,多出来的中间那层称为隐藏层或中间层。从计算上来看,神经网络的正向传播和反向传播比logistic回归多了一次重复的计算。引入新的标签:方括号上标[i]表示当前所处…

windows安装rabbitmq后出现:Error::plugins_dir_does not_exist

安装的路径正常,没有空格中文字符啥的。 环境变量也配置了。原因是:安装otp_win64_24.1.7时没有选择以管理员身份运行。重新卸载安装即可

Zero-Shot,One-Shot,Few-Shot,In-Context Learning

Zero-Shot,One-Shot,Few-Shot,In-Context Learning https://blog.csdn.net/weixin_44212848/article/details/139902394In-Context Learning定义:In-context learning是一种在不显式微调模型权重的情况下,通过给模型提供相关的上下文信息(例如提示或样本)来实现模型性能…

GoLand 相关设置

GoLand 相关设置 自动导包设置

AutoCAD C# 判断多边形与点的位置关系

书上说,射线法和叉乘法感觉都不完整 下面我分享我写的基于AutoCAD BREP算法var ed = acApp.Application.DocumentManager.MdiActiveDocument.Editor;var peo = new PromptEntityOptions("Select a PolyLine : ");peo.SetRejectMessage("Only PolyLine");…

Nginx使用篇:实现负载均衡、限流与动静分离

Nginx实用篇:实现负载均衡、限流与动静分离| 原创作者/编辑:凯哥Java | 分类:Nginx学习系列教程nginx的logo Nginx 作为一款高性能的 HTTP 服务器及反向代理解决方案,在互联网架构中扮演着至关重要的角色。它不仅支持负载均衡、流量控制等功能…