28.ReentrantLock-多条件变量

news/2025/3/14 5:33:33/

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.ppmy.cn/news/1405568.html

相关文章

Windows Edge浏览器兼容性问题诊断与修复策略详解

随着Microsoft Edge浏览器的持续迭代与更新,其性能与兼容性已得到了显著提升。然而,在面对互联网上纷繁复杂的网页内容时,仍有可能遇到兼容性问题。本文旨在探讨Edge浏览器在处理网页兼容性问题时的常见场景、原因分析及相应的解决方案&#…

秒验:让APP验证和登录远不只是便捷

在互联网时代,手机号码已成为用户在App应用中的身份标识,用于登录和身份核验。目前,大多数App应用采用短信验证码的方式进行登录,但这种方式存在一些缺点,如操作繁琐、验证码接收不及时或被截取等。随着5G时代的到来&a…

大数据设计为何要分层,行业常规设计会有几层数据

大数据设计通常采用分层结构的原因是为了提高数据管理的效率、降低系统复杂度、增强数据质量和可维护性。这种分层结构能够将数据按照不同的处理和应用需求进行分类和管理,从而更好地满足不同层次的数据处理和分析需求。行业常规设计中,数据通常按照以下…

docker导出导入镜像

docker导出镜像 查看要导出的镜像 docker images主要有两列 REPOSITORY TAG 导出命令 导出公式 docker save -o xxxx.tar REPOSITORY:TAG例子 docker save -o minio.tar minio/minio:latestminio/minio:latest可以使用image id代替,但是使用image id会导致导…

常州SAP实施公司有哪些值得推荐

随着信息技术的不断发展和企业管理的日益复杂,SAP系统在各行各业中扮演着越来越重要的角色。常州作为中国制造业的重要基地之一,其企业在数字化转型的道路上也越来越多地采用SAP系统,以提高管理效率、降低成本、优化资源配置,从而…

Excel中文显示问号

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

基于单片机20v数字电压表仿真系统设计

**单片机设计介绍,基于单片机20v数字电压表仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机20V数字电压表仿真系统设计的主要目标是实现一个能够准确测量和显示20V直流电压的仿真系统。以下是该设计的主…

专升本-物联网

物联网(IOT,Internet of things) 体系结构: 感知层(感知执行层) 网络层 应用层 基本特征: 全面感知 可靠传输 智能处理 作用: 信息采集、转换、收集 信息传递和处理 数据…