【JUC的四大同步辅助类】

文章目录

  • 一、CountDownLatch
  • 二、CyclicBarrier
  • 三、Semaphore
  • 四、Phaser


提示:以下是本篇文章正文内容,下面案例可供参考

一、CountDownLatch

CountDownLatch如同火箭发射,计数只能不断减减,当到达0时即发射
场景示例:考场中有多个同学考试,每个同学写完试卷后,将试卷交给老师即可离开,老师需要收齐所有人的试卷后才能离开。

代码如下(示例)

public class Test {public static void main(String[] args) throws InterruptedException {// CountDownLatch 倒计时到0,发射(减法)// 考场学生人数为 6(一旦定下就不能在增加)CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <= 6; i++) {new Thread(() -> {try {// 模拟每个学生完成试卷的时间不同(线程休眠随机时间)Thread.sleep(new Random().nextInt(3000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "\t同学写完,离开教室");// 上交试卷给老师(走一个,计数减少一个)countDownLatch.countDown();}, i + "号考生").start();}// 主线程相当于老师,需要等所有的人交卷,才能离开(阻塞当前线程,等待所有线程完成任务,即 countDown)countDownLatch.await();Thread.currentThread().setName("老师");System.out.println(Thread.currentThread().getName() + "\t收齐试卷,关门走人");}
}

输出结果

在这里插入图片描述


二、CyclicBarrier

CyclicBarrier如同游戏匹配,不凑齐人数,就一直在匹配界面,达到指定人数后才能开始对战

代码如下(示例)

public class Test {public static void main(String[] args) throws InterruptedException {// CyclicBarrier 指定值达到 0,发射// 需要十个人才能开始游戏,(指定个数,之后不能改变,满足条件后,自动执行 Runnable 方法)CyclicBarrier cyclicBarrier = new CyclicBarrier(10, () -> {System.out.println("十个人已经全部确认,开始游戏");});for (int i = 1; i <= 10; i++) {final int tmpInt = i;new Thread(() -> {try {// 模拟玩家匹配时间Thread.sleep(new Random().nextInt(3000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "\t已经确认");try {// 等待其他玩家准备(阻塞等待,等待人数减 1,减到 0,就发车)cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}, tmpInt + "号玩家").start();}}
}

输出结果
在这里插入图片描述


三、Semaphore

Semaphore如同一个停车场,里面的车位数是固定的,当停满车后,必须有车出来才能再进

Semaphore 主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
涉及到并发就有有两种模式:

  1. 非公平(谁抢到是谁的),默认是非公平的
    public Semaphore(int permits) {sync = new NonfairSync(permits);}
  1. 公平(先来后到),当 fair 为 true 是公平的
    public Semaphore(int permits, boolean fair) {sync = fair ? new FairSync(permits) : new NonfairSync(permits);}

代码如下(示例)

public class Test {public static void main(String[] args) throws InterruptedException {// 一共 3 个停车位(资源数开始时固定)Semaphore semaphore = new Semaphore(3);// 默认非公平(抢占式)// 模拟 6 辆汽车要停车for (int i = 1; i <= 6; i++) {new Thread(() -> {try {// 询问还有没有停车位,有就进去,没有等待(获得资源)semaphore.acquire();System.out.println(Thread.currentThread().getName() + "\t抢到车位");// 模拟停车时间Thread.sleep(new Random().nextInt(3000));System.out.println(Thread.currentThread().getName() + "\t事情办完,离开车位");} catch (InterruptedException e) {e.printStackTrace();} finally {// 办完事情,开车离开(释放资源)semaphore.release();}}, i + "号车主").start();}}
}

输出结果
在这里插入图片描述


四、Phaser

Phaser是JDK 7新增的一个同步辅助类,它可以实现CyclicBarrier和CountDownLatch类似的功能,而且它支持对任务的动态调整,并支持分层结构来达到更高的吞吐量。

CountDownLatch 和 CyclicBarrier 在最初就固定了线程的数量,而且中途不可改变,当完成指定的任务后,就不能再次使用,Phaser 就解决了该问题。

class player implements Runnable {private final Phaser phaser;player(Phaser phaser) {this.phaser = phaser;}@Overridepublic void run() {try {// 第一阶段——确定参赛的运动员人数(等待创建好所有线程再开始)phaser.arriveAndAwaitAdvance();// 第二阶段——等待所有选手都做好准备,发令枪再开始Thread.sleep(new Random().nextInt(3000));// 模拟热身准备System.out.println(Thread.currentThread().getName() + "号运动员准备完毕");phaser.arriveAndAwaitAdvance();// 第三阶段——所有运动员开始跑步Thread.sleep(new Random().nextInt(3000));// 模拟跑步时间System.out.println(Thread.currentThread().getName() + "号运动员冲线!");// 冲线后结束(线程下线注销)phaser.arriveAndDeregister();} catch (InterruptedException e) {e.printStackTrace();}}
}public class Test {public static void main(String[] args) throws InterruptedException {// 模拟了 100 米赛跑,10 名运动员,只等裁判一声令下。当所有人都到达终点时,比赛结束。// 设置初始的注册人数(1 个裁判)final Phaser phaser = new Phaser(1);// 十名运动员for (int index = 0; index < 10; index++) {// 每个运动员都注册到其中,即确定参加比赛(动态增加,复用)phaser.register();new Thread(new player(phaser), index + "号运动员").start();}System.out.println("比赛开始");// 裁判下线,注销当前线程,比赛开始phaser.arriveAndDeregister();// 所有运动员是否到达终点,没有就一直等待while (!phaser.isTerminated()) {}System.out.println("所有运动员到达终点,比赛结束");}
}

输出结果
在这里插入图片描述

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

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

相关文章

案例089:基于微信小程序的校园综合服务平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …

Typora+PicGo+Gitee构建云存储图片

创建Gitee仓库 首先&#xff0c;打开工作台 - Gitee.com&#xff0c;自行注册一个账户 注册完后&#xff0c;新建一个仓库&#xff08;记得仓库要开源&#xff09; 然后创建完仓库后&#xff0c;鼠标移动到右上角头像位置&#xff0c;选择设置&#xff0c;并点击&#xff…

终于学会听英文歌了:A Sad Me In Your Eyes

A Sad Me In Your Eyes 来源&#xff1a; https://lyricstranslate.com/en/ln-party-sad-me-your-eyes-lyrics.html Fire can’t burn in my eyes If without your smile Snow can cover your smile If without your love When you think of me, I’ve gone too far I can’t …

了解OpenApi和Swagger

Swagger 和 OpenAPI 是一种用于描述 RESTful API 的规范和工具集合。在本文中&#xff0c;我们将探讨 Swagger 和 OpenAPI 的概念、作用、使用方法以及优缺点。 Swagger 和 OpenAPI 的概念 Swagger 是一种用于描述 RESTful API 的规范。它提供了一种简单的方式来描述 API 的请…

Python 热力图的绘制(Matplotlib篇-12)

Python 热力图的绘制(Matplotlib篇-12)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

文件内容搜索利器 - grep

文章目录 文件内容搜索利器 - grep语法默认无参数增加文件夹反向查找不区分大小写显示行数,精准定位更多信息文件内容搜索利器 - grep Linux grep 命令用于查找文件里符合条件的字符串。 官方定义为: grep, egrep, fgrep - print lines matching a pattern grep支持正则表达…

ubuntu安装conda

在 Ubuntu 系统上安装 Anaconda 是一个直接的过程。Anaconda 是一个流行的 Python 和 R 数据科学及机器学习平台&#xff0c;它包括了许多科学计算和数据处理的库。以下是在 Ubuntu 上安装 Anaconda 的步骤&#xff1a; 1. 下载 Anaconda 安装脚本 首先&#xff0c;需要从 An…

2024年年初Java5年实战面试题(北京)

高阶篇&#xff1a; 一、在面对千万条并发请求的情况下&#xff0c;如果数据库频繁查询导致崩溃&#xff0c;可以采取以下措施来解决问题: 1.缓存数据:可以使用缓存技术来减少对数据库的查询次数。将经常查询的数据存储在缓存中&#xff0c;例如使用Redis等内存数据库&#xff…

如何做好档案数字化前的鉴定工作

要做好档案数字化前的鉴定工作&#xff0c;可以按照以下步骤进行&#xff1a; 1. 确定鉴定目标&#xff1a;明确要鉴定的档案的内容、数量和性质&#xff0c;确定鉴定的范围和目标。 2. 进行档案清点&#xff1a;对档案进行全面清点和登记&#xff0c;包括数量、种类、状况等信…

立体匹配算法(Stereo correspondence)

SGM(Semi-Global Matching)原理&#xff1a; SGM的原理在wiki百科和matlab官网上有比较详细的解释&#xff1a; wiki matlab 如果想完全了解原理还是建议看原论文 paper&#xff08;我就不看了&#xff0c;懒癌犯了。&#xff09; 优质论文解读和代码实现 一位大神自己用c实现…

分析Java中的StringHelper类

目录 前言1. 概念2. 功能示例3. Demo示例 前言 在项目中实战学习并记录可用的工具类 1. 概念 Java标准库&#xff08;java.lang包&#xff09;并没有提供名为StringHelper的类。通常&#xff0c;类似的字符串处理工具类并不是Java标准库的一部分&#xff0c;而是由程序员自行…

python使用隐马尔可夫模型识别波形数据MFCC特征

python使用隐马尔可夫模型识别振动波形数据MFCC特征 1、简介 ​ 隐马尔可夫模型非常擅长对时间序列数据进行建模。 ​ 由于振动波形数据是时间序列信号,HMM能够满足波形分类需求。 ​ 隐马尔可夫模型是表示观察序列的概率分布的模型。假设输出是由隐藏状态生成的。 2、数…

如何在Windows安装Wnmp服务并实现固定地址远程访问

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

58.0/PhotoShop 图层的应用(详细版)

目录 58.1 图层的概念 58.2 图层的控制面板 58.3 图层的基本操作 58.3.1 新建图层 58.3.2 选择图层 58.3.3 复制图层 58.3.4 调整图层的叠加顺序 58.3.5 合并图层 58.4 图层样式 58.4.1 投影 58.4.2 内阴影 58.4.3 外发光样式 58.4.4 内发光样式 58.4.5 斜面和浮雕…

JSONyaml和Properties

注&#xff1a;取自GPT&#xff0c;总是忘记了&#xff0c;那我干脆就写一篇blog YAML&#xff08;YAML Ain’t Markup Language 或 YAML Ain’t a Markup Language&#xff09;和 JSON&#xff08;JavaScript Object Notation&#xff09;是两种不同的数据序列化格式&#xf…

程序员提问的艺术:28.4K Star指南,告别成为办公室讨厌鬼!

Github: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way 原文&#xff1a;http://www.catb.org/~esr/faqs/smart-questions.html ✅为什么讨厌某些提问者 未自行尝试解决问题&#xff1a; ❌“怎么用Java写一个排序算法&#xff1f;” &#x1f44d;&#…

计算机毕业设计 基于SpringBoot的工作量统计系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

IDEA断点调试

IDEA断点调试 断点调试是一种在程序执行过程中暂停执行并逐步检查代码状态的方法。它允许开发者在程序运行到特定位置时暂停执行&#xff0c;查看变量的值、执行过程和调用栈等信息&#xff0c;从而更好地理解代码的运行情况和解决问题。可以帮助我们查看java底层源代码的执行…

day 57 算法训练|动态规划part17

参考&#xff1a;代码随想录 647. 回文子串 1. dp数组&#xff08;dp table&#xff09;以及下标的含义 是不是能找到一种递归关系&#xff0c;也就是判断一个子字符串&#xff08;字符串的下表范围[i,j]&#xff09;是否回文&#xff0c;依赖于&#xff0c;子字符串&#x…