28.ReentrantLock-多条件变量

synchronized中也有条件变量,当条件不满足时进入WaitSet等待。

ReentrantLock的条件变量比Synchronized强大之处在于它支持多个条件变量

await和signal方法

多条件变量的使用流程

1.await需要获得锁。

2.await执行后会释放锁,进入ConditionObject等待。

3.await被线程唤醒、或者打断、或者超时会重新竞争lock锁。

4.竞争lock成功后,从await后继续执行。

@Slf4j
public class ReentrantLockBean {private static ReentrantLock reentrantLock = new ReentrantLock();private static boolean hasCigarette = false;private static boolean hasMeal = false;//条件一,等烟的房间private static Condition waitCigaretteRoom = reentrantLock.newCondition();//条件二,等餐的房间private static Condition waitMealRoom = reentrantLock.newCondition();public static void main(String[] args) {new Thread(()->{reentrantLock.lock();try {log.info("有烟没?{}", hasCigarette);while(!hasCigarette) { // 没有烟log.info("没有烟歇会....");try {//获得锁后进行等待,进入条件一,等烟的房间waitCigaretteRoom.await();} catch (InterruptedException e) {e.printStackTrace();}}log.info("开始干活.....");} finally {reentrantLock.unlock();}}, "t1").start();new Thread(() -> {reentrantLock.lock();try {log.info("外卖到了没?{}", hasMeal);while (!hasMeal) {//没有送到log.info("外卖没有到...");try {//获得锁后进行等待,进入条件二,等餐的房间waitMealRoom.await();} catch (InterruptedException e) {e.printStackTrace();}}log.info("开始工作.....");}finally {reentrantLock.unlock();}}, "t2").start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {reentrantLock.lock();try {log.info("烟来了...");hasCigarette = true;//唤醒等烟的条件变量waitCigaretteRoom.signal();}finally {reentrantLock.unlock();}}, "t3").start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {reentrantLock.lock();try {log.info("餐来了...");hasMeal = true;//唤醒等餐的条件变量waitMealRoom.signal();}finally {reentrantLock.unlock();}}, "t4").start();}
}

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

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

相关文章

算法基础--递推

😀前言 递推算法在计算机科学中扮演着重要的角色。通过递推,我们可以根据已知的初始条件,通过一定的规则推导出后续的结果,从而解决各种实际问题。本文将介绍递推算法的基础知识,并通过一些入门例题来帮助读者更好地理…

[Flutter]页面跳转和传值

一、页面跳转 1.基本页面跳转 Navigator 介绍 在 Flutter 中,Navigator 是一个管理应用视图(页面)的组件,它使用栈(Stack)的方式来控制页面的切换。每当你跳转到一个新页面时,Navigator 会将…

os模块篇(十一)

文章目录 os.chdir(path)os.chmod(path, mode, *, dir_fdNone, follow_symlinksTrue)os.chown(path, uid, gid, *, dir_fdNone, follow_symlinksTrue)os.getcwd()os.getcwdb()os.lchflags(path, flags)os.lchmod(path, mode)os.lchown(path, uid, gid) os.chdir(path) os.chdi…

CSS3 实现文本与图片横向无限滚动动画

文章目录 1. 实现效果2.html结构3. css代码 1. 实现效果 gif录屏比较卡&#xff0c;实际很湿滑&#xff0c;因为是css动画实现的 2.html结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

Java中的装饰器模式

在Java中&#xff0c;装饰器模式允许我们动态地给对象添加新的行为或责任&#xff0c;而无需修改原有类。以下是一个简单的装饰器模式示例&#xff0c;我们将模拟一个咖啡销售系统&#xff0c;其中基础饮料类&#xff08;Component&#xff09;是Coffee&#xff0c;装饰器类&am…

VC++、GCC、CLANG,INT128有符号整数编译器关键字

注意INT128为目标平台扩展关键字&#xff0c;不属于C/C语言本身支持特性&#xff0c;每个C/C编译器平台支持上都略有不同&#xff0c;甚至不支持。 可以详细参考本人此篇文章&#xff1a; GUN C/C (GCC/CLANG) 对于 __int128_t &#xff08;128位有符号大整数的扩展支持平台限…

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

M91HV-EX防爆布控球

防爆EX说明 产品介绍 布控球是专为户外无线网络及无供电环境而又需要现场录像取证和远程实时视频监控而打造的一款便携式的智能装备。布控球采用稳定的Linux嵌入式操作系统&#xff0c;运用先进的AI算法技术、5G无线通信技术、AGPS辅助定位技术及H.265视频压缩技术&#xff1b;…

语言模型进化史(上)

由于篇幅原因&#xff0c;本文分为上下两篇&#xff0c;上篇主要讲解语言模型从朴素语言模型到基于神经网络的语言模型&#xff0c;下篇主要讲解现代大语言模型以及基于指令微调的LLM。文章来源是&#xff1a;https://www.numind.ai/blog/what-are-large-language-models 一、语…

【Linux】进程控制详解

目录 前言 进程创建 认识fork 写时拷贝 再谈fork 进程终止 进程退出码 用代码来终止进程 常见的进程终止的方式 exit _exit 进程等待 进程等待的必要性 进程等待的方式 wait waitpid 详解status参数 详解option参数 前言 本文适合有一点基础的人看的&#…

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

Excel中文显示问号

直接上操作步骤&#xff1a; 1&#xff09;打开Excel -> 文件 -> 选项 -> 语言 2&#xff09;Office 显示语言&#xff0c;“中文(简体)”设置为首选。 3&#xff09;Office创作语言和校对&#xff0c;“中文(简体)”设置为首选。 网上用记事本转换的方法&#xff0c;…

【c++】STl-list使用list模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 …

点大商城V2版 2.5.7全开源版 全插件+百度+支付宝+QQ+头条+小程序端+uniapp开源端

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用&#xff0c;支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序&#xff0c;本程序是点大商城V2独立版&#xff0c;包含全部插件&#xff0c;代码全开源&#xff0c;并且有VUE全端代码。分销&am…

【Java基础】Java基础知识整合

文章目录 1. 转义字符2. 变量2.1 字符串与整型相加2.2 byte和short的区别2.3 float和double的区别2.4 char类型2.5 boolean类型2.6 自动类型转换及运算2.7 强制类型转换2.8 String的转换2.9 除法运算2.10 取模规则 3. 自增4. 逻辑运算符5. 赋值运算 6. 三元运算符&#xff1a;7…

babyAGI(7)-babyCoder源码阅读3(任务执行相关agent)

1. 任务分配agent 该agent会根据&#xff0c;objective和task的内容自动分配要执行的agent code_writer_agent 编写新代码或增加新功能使用该agentcode_reactor_agent 任务涉及到修改或优化执行该agentcommand_executor_agent 任务涉及到文件操作执行该agent 整个任务分配的…

前端的拖拽序列(drag)

html和css代码如下 <style>.item {width: 200px;height: 50px;background: rgb(15, 226, 219);margin: 10px 0;padding-left: 20px;border-radius: 10px;line-height: 50px;}.item.move {background: transparent;color: transparent;border: 1px dashed #ccc;}</sty…

关于ubuntu18.04 ARM架构更换源失败的问题

更换源后报错&#xff1a; E: Failed to fetch http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/trusty-security/main/binary-arm64/Packages 404 Not Found [IP: 2402:f000:1:400::2 80] E: Failed to fetch http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/trusty-…

C++(12): std::mutex及其高级变种的使用

1. 简述 在多线程或其他许多场景下&#xff0c;同时对一个变量或一段资源进行读写操作是一个比较常见的过程&#xff0c;保证数据的一致性和防止竞态条件至关重要。 C的标准库中为我们提供了使用的互斥及锁对象&#xff0c;帮助我们实现资源的互斥操作。 2. std::mutex及其衍…

QT - 日志:qDebug/qInfo/qWarning/qCritical

篇一、日志打印函数 头文件&#xff1a; #include <QDebug> 代码&#xff1a;qDebug()<<"hello world!"; 其他打印级别&#xff1a; qInfo(): 普通信息 qDebug(): 调试信息 qWarning(): 警告信息 qCritical(): 严重错误 qFatal(): 致命错误 1. qDebug…