三个不同线程顺序打印ABC十种写法【并发编程JUC】

夫陶公清风千古,余又何人,敢称庶几
在这里插入图片描述
个人博客地址:http://www.breez.work


📖写法一:使用信号量Semaphore

public class Foo {private Semaphore semaphoreB = new Semaphore(0);private Semaphore semaphoreC = new Semaphore(0);public Foo() {}public void first() throws InterruptedException {System.out.println("A");semaphoreB.release();}public void second() throws InterruptedException {semaphoreB.acquire();System.out.println("B");semaphoreC.release();}public void third() throws InterruptedException {semaphoreC.acquire();System.out.println("C");}
}

📖写法二:加synchronized锁

public class Foo {private Object lock = new Object();private boolean a;private boolean b;public Foo() {}public void first() throws InterruptedException {synchronized (lock) {System.out.println("A");a = true;lock.notifyAll();}}public void second() throws InterruptedException {synchronized (lock) {while (!a) {lock.wait();}System.out.println("B");b = true;lock.notifyAll();}}public void third() throws InterruptedException {synchronized (lock) {while (!b) {lock.wait();}System.out.println("C");}}
}

📖写法三:使用原子AtomicInteger

public class Foo {private AtomicInteger a2 = new AtomicInteger(0);private AtomicInteger a3 = new AtomicInteger(0);public Foo() {}public void first() throws InterruptedException {System.out.println("A");a2.incrementAndGet();}public void second() throws InterruptedException {while (a2.get() != 1) {}System.out.println("B");a3.incrementAndGet();}public void third() throws InterruptedException {while (a3.get() != 1) {}System.out.println("C");}
}

📖写法四:使用队列BlockingQueue

public class Foo {BlockingQueue<String> queue2 = new ArrayBlockingQueue<>(1);BlockingQueue<String> queue3 = new ArrayBlockingQueue<>(1);public Foo() {}public void first() throws InterruptedException {System.out.println("A");queue2.offer("b");}public void second() throws InterruptedException {while (queue2.size() == 0) {}System.out.println("B");queue3.offer("c");}public void third() throws InterruptedException {while (queue3.size() == 0) {}System.out.println("C");}
}

📖写法五:使用Condition

public class Foo {private int number = 1;private Lock lock = new ReentrantLock();private Condition a = lock.newCondition();private Condition b = lock.newCondition();private Condition c = lock.newCondition();public Foo() {}public void first() throws InterruptedException {lock.lock();try {while (number != 1) {a.await();}System.out.println("A");number = 2;b.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void second() throws InterruptedException {lock.lock();try {while (number != 2) {b.await();}System.out.println("B");number = 3;c.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void third() throws InterruptedException {lock.lock();try {while (number != 3) {c.await();}System.out.println("C");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

📖写法六:使用计数器CountDownLatch

public class Foo {private CountDownLatch c2 = new CountDownLatch(1);private CountDownLatch c3 = new CountDownLatch(1);public Foo() {}public void first() throws InterruptedException {System.out.println("A");c2.countDown();}public void second() throws InterruptedException {c2.await();System.out.println("B");c3.countDown();}public void third() throws InterruptedException {c3.await();System.out.println("C");}}

测试代码

public static void main(String[] args) throws InterruptedException {Foo foo = new Foo();new Thread(() -> {try {foo.first();} catch (InterruptedException e) {e.printStackTrace();}}, "A").start();new Thread(() -> {try {foo.second();} catch (InterruptedException e) {e.printStackTrace();}}, "B").start();new Thread(() -> {try {foo.third();} catch (InterruptedException e) {e.printStackTrace();}}, "C").start();}

欢迎加入BreezAm技术交流群:3861 35311 【QQ群】
在这里插入图片描述

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

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

相关文章

技术直播:数据科学到底该怎么“玩”?

90年代初&#xff0c;王健林抓住的房地产的机遇&#xff0c;现在才敢说“一个亿的小目标”&#xff1b;千禧年后 &#xff0c;“马爸爸”抓住了电商的机遇&#xff0c;现在才能说“我对钱没有兴趣”。今年由于特殊情况&#xff0c;加速了远程办公、在线教育和在线医疗的发展&am…

Apache Flink 为什么能够成为新一代大数据计算引擎?

众所周知&#xff0c;Apache Flink&#xff08;以下简称 Flink&#xff09;最早诞生于欧洲&#xff0c;2014 年由其创始团队捐赠给 Apache 基金会。如同其他诞生之初的项目&#xff0c;它新鲜&#xff0c;它开源&#xff0c;它适应了快速转的世界中更重视的速度与灵活性。 大数…

超燃!支付宝技术双11纪录片《一心一役》全球独家首发

​和过去10年一样&#xff0c;2019年天猫双11又创造了一个全新的纪录。 这个数字背后&#xff0c;是数代支付宝工程师们殚精竭虑、不断突破技术难关。 今年双11之前&#xff0c;小编邀请到11位经历双11的技术同学口述实录&#xff0c;特别筹备了纪录片《一心一役》&#xff0c…

RabbitMQ消息队列简单异步邮件发送和订单异步处理实战【应用解耦】【异步削峰】

介绍 &#x1f4d6;源码地址&#xff1a; https://gitee.com/breez/mq-shop 介绍 使用RabbitMQ消息队列异步发送短信和邮件、订单异步处理【流量削峰】 软件架构 技术栈 序号名称1SpringBoot2SpringMVC3Mybatis plus4RabbitMQ5SpringBoot Mail 特点: 邮件发送的封装三大发…

秋名山老司机从上车到翻车的悲痛经历,带你深刻了解什么是 Spark on Hive!| 原力计划...

作者 | Alice菌责编 | 夕颜出品 | CSDN博客本篇博客将为大家分享的内容是如何实现Spark on Hive&#xff0c;即让Hive只作为存储角色&#xff0c;Spark负责sql解析优化&#xff0c;执行…话不多说&#xff0c;直接上车&#xff01;上车前需知Spark on hive 与 hive on spark 的…

从电商到软件市场,阿里双11战火蔓延

2019年“双十一”&#xff0c;是阿里天猫奋战的第11个年头&#xff0c;更是阿里在电商行业的一个重要的里程碑。今年&#xff0c;整个阿里系也在“一心一役”全面出击&#xff0c;作为阿里旗下的重要大将——阿里云也加入了这场购物狂欢&#xff0c;将火热的购物氛围从C端消费者…

RuoYi-Cloud 部署篇_01(linux环境 mysql+nginx版本)

文章目录一、基础准备1. 技术选型2. 源码克隆3. 安装依赖4. 将 RuoYi-Cloud 项目导入到 IDEA5. 安装启动Mysql6. 安装启动Redis7. 创建数据库&#xff0c;执行 SQL脚本文件二、安装与配置 nacos2.1. 下载nacos2.2. 安装 nacos2.3. nacos持久化配置2.4. 执行脚本文件2.5. nacos连…

SpringBoot集成Elasticsearch实现博客高亮搜索

文章目录效果展示二、使用步骤1.引入maven依赖2. 编写spplication.properties3.配置客户端4.高亮搜索5.转换成实体对象总结效果展示 虽然看起来巴适&#xff0c;但是挺简单的&#xff01; &#x1f4dd; 英文检索 &#x1f4dd; 中文单字检索 二、使用步骤 1.引入maven依赖…

淘系技术,实力为2019年双11而战!稳!

2019 天猫双 11 全球狂欢节96秒成交额破百亿&#xff0c;24小时总成交额2684亿&#xff0c;创造了交易创建峰值 54.4万笔&#xff0f;秒的历史记录。天猫双11&#xff0c;已经不仅是购物节&#xff0c;也是品牌成长节、消费者互动节。天猫双11更是是商业的奥林匹克。 今年&…

上班从不迟到,生病不敢请假,加班唯命是从,明明已经很拼命了,为什么还是缺钱?...

为了省几百块钱房租&#xff0c;每天在路上多花两三个小时&#xff1b;为了少花几毛钱&#xff0c;买包纸巾也要货比三家&#xff1b;被上司大声指责&#xff0c;为了保住饭碗&#xff0c;只能陪着笑脸......上班从不迟到&#xff0c;生病不敢请假&#xff0c;加班唯命是从&…

RuoYi-Cloud 部署篇_02(linux环境 mysql+nginx版本)

文章目录一、模块配置修改1. ruoyi-gateway-dev.yml2. ruoyi-auth-dev.yml3. ruoyi-system-dev.yml4. ruoyi-gen-dev.yml5. ruoyi-job-dev.yml6. ruoyi-file-dev.yml二、后端配置预启动2.1. 部署资料整合2.2. 模块端口划分2.3. 组件端口划分2.4. 服务脚本编写2.5. 前端编译生产…

Flink State 有可能代替数据库吗?

有状态的计算作为容错以及数据一致性的保证&#xff0c;是当今实时计算必不可少的特性之一&#xff0c;流行的实时计算引擎包括 Google Dataflow、Flink、Spark (Structure) Streaming、Kafka Streams 都分别提供对内置 State 的支持。State 的引入使得实时应用可以不依赖外部数…

简易投票系统数据库设计

介绍 简易版的投票系统数据库设计. 发现设计有误请在评论区指出&#xff0c;谢谢&#xff01; 一、截图 项目表 选项表 投票表 二、代码 票表 CREATE TABLE as_ticket (id varchar(64) NOT NULL COMMENT 主键,title varchar(100) DEFAULT NULL COMMENT 投票标题,descr…

万级规模 K8s 如何管理?蚂蚁双11核心技术公开

阿里妹导读&#xff1a;Kubernetes 大幅降低了容器化应用部署的门槛&#xff0c;并以其超前的设计理念和优秀的技术架构&#xff0c;在容器编排领域拔得头筹。越来越多的公司开始在生产环境部署实践。本文将分享蚂蚁金服是如何有效可靠地管理大规模 Kubernetes 集群的&#xff…

定了!2020年,6种将死的编程语言!

编程界语言排行榜又要面临一次全新的洗牌&#xff0c;六大编程语言将要黄了&#xff01;此消息一出&#xff0c;令众多程序员心碎&#xff01;那么这将“亡”的六大语言中有你所擅长的吗&#xff1f;Perl&#xff0c;Haskell&#xff0c;Ruby&#xff0c;Visual Basic.NET&…

RuoYi-Cloud 部署篇_03(linux环境 Mysql+nginx版本)

文章目录一、localhost无法路由1. nacos控制台2. sentinel控制台3. admin控制台二、思路分析2.1. 现象分析2.2. 原因分析2.3. 解决思路三、解决方案&#xff08;第一种&#xff09;3.1. 调整路由url3.2. 效果验证四、解决方案解决方案&#xff08;第二种&#xff09;4.1. 域名分…

论坛系统数据库设计

论坛系统数据库设计 文章目录论坛系统数据库设计前言一、社区论坛是什么&#xff1f;二、设计表1.用户表2.Token表3. 文章表4. 话题表5. 问题表6. 评论表7. 投票表8. 回答表9. 举报表10. 话题关系对应表11. 通知表12. 私信表13. 关注关系表14. 图片表15. 设置表16. 缓存表总结前…

阿里文娱首次公开!AI 如何对爆款内容未卜先知?

阿里妹导读&#xff1a;文娱内容很难有完整的量化指标体系&#xff0c;内容的复杂性决定了文娱产品的不确定性。我们如何利用AI大数据能力&#xff0c;建造文娱的内容认知大脑&#xff1f;串联内容全生命周期&#xff0c;实现对内容、流量、宣推等的“未卜先知”&#xff0c;提…

Sentinel 1.7.0 发布,支持 Envoy 集群流量控制

流控降级中间件 Sentinel 1.7.0 版本正式发布&#xff0c;引入了 Envoy 集群流量控制支持、properties 文件配置、Consul/Etcd/Spring Cloud Config 动态数据源适配等多项新特性与改进。详细特性列表请参考 Release Notes&#xff0c;欢迎大家使用并提出建议。 下面我们来一起…

RuoYi-Cloud 部署篇_02(windows环境 mysql版本)

文章目录一、模块配置修改1. ruoyi-gateway-dev.yml2. ruoyi-auth-dev.yml3. ruoyi-system-dev.yml4. ruoyi-gen-dev.yml5. ruoyi-job-dev.yml6. ruoyi-file-dev.yml二、后端配置预启动2.1. 配置 idea的 RunDashboard2.2. 运行后端三、部署前端3.1. 安装依赖3.2. 运行前端6.3. …