CountDownLatch CyclicBarrier 原理 总结

2023-11-13

参考链接:http://ifeve.com/talk-concurrency-countdownlatch/
http://www.importnew.com/15731.html
https://www.cnblogs.com/nullzx/p/5271964.html
https://blog.csdn.net/zzg1229059735/article/details/61191679
https://www.jianshu.com/p/060761df128b
https://www.cnblogs.com/nullzx/p/5271964.html
CyclicBarrier和CountDownLatch区别

CountDownLatch原理

CountDownLatch是使用一组线程来等待其它线程执行完成,这个场景类似于一群人考试,先做的人先交了,但是在考试时间没到的前提下,老师必须额等待最后一个学生完成交卷老师才能走,CountDownLatch使用Sync继承AQS。构造函数很简单地传递计数值给Sync,并且设置了state,这个state的值就是倒计时的数值,每当一个线程完成了自己的任务(学生完成交卷),那么就使用CountDownLatch.countdown()方法来做一次state的减一操作,在内部是通过CAS完成这个更新操作,直到所有的线程执行完毕,也就是说计数值变成0,那么就然后在闭锁上等待的线程就可以恢复执行任务。

CyclicBarrier原理 栅栏

CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBarrier的await()方法。
实现原理:在CyclicBarrier的内部定义了一个Lock对象,其实就是ReenTrantLock对象,每当一个线程调用CyclicBarrier的await方法时,将剩余拦截的线程数减1,然后判断剩余拦截数是否为0,如果不是,进入Lock对象的条件队列等待。如果是,执行barrierAction对象的Runnable方法,然后将锁的条件队列中的所有线程放入锁等待队列中,这些线程会依次的获取锁、释放锁,接着先从await方法返回,再从CyclicBarrier的await方法中返回。
其中await方法:1.获取lock对象,然后拦截数减一,直到拦截数为0,结束await
2.出现中断,结束栅栏然后退出
3.超时也可以退出栅栏

CyclicBarrier和CountDownLatch的区别

1.CountDownLatch 可以说成一个或者一组线程1等待其它线程执行完毕,重点是每当一个线程的countdown减一的时候,是其中的一个线程执行完了一个任务,可以类比成大家一起考试,有的人提前交卷了,而老师还是不能走,因为还有人没做完,得等全部人做完才行;
而CyclicBarrier则是一组线程互相等待,只有全部到达了栅栏点以后才能继续执行;这个可以类比成上车,只有乘客把车上的位置占用完了以后,车才能开始,也就是大家都在等位置坐满,并不是说有一个人坐上车(到栅栏点),这个人就可以坐公交车走了,这个人心里也清楚得等车上的位置坐满车才能走,大家心里默认是互相等待车完全坐满,也就是前面说的一组线程互相等待的意思
1.CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
2.CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回true。
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CountDownLatch CyclicBarrier 原理 总结 的相关文章

  • Java GuardedString - 用于加密的随机密钥是否存储在 Java 堆内存中?如果不是,那么密钥保存在哪里?

    Oracle 的 org identityconnectors common security GuardedString 要转换为 GuardedString 的原始数据需要由 EncryptorImpl class 随机生成的加密密钥
  • 将 CSV 文件读入 Java 作为数据库表

    我发现了很多关于使用 Java 读取 CSV 的帖子 并且他们所指向的 API 在读取 CSV 文件时都采用了面向行的方法 就像 当你得到一行时 获取每一列的值 我希望有一个更高级别的 API 比如在 Perl 中 DBI 允许您在 CSV
  • 使用比较器对对象进行排序给出空指针

    我正在尝试对包含 3 张卡的 ArrayList 进行排序 我正在用比较器来做这件事 这是否太过分了 Card getRank 返回 2 到 14 之间的整数 我完全不知道哪里出了问题 我之前已经成功完成了这个 并与我的其他代码进行了比较
  • Hibernate 自定义架构创建

  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • eclipse juno 打开时出错

    在安装 Eclipse 并正常工作一年多后 我今天打开 Eclipse Juno 并在打开工作区时收到一条错误消息 我使用的是 Windows 8 64 位 Java 64 位和 Eclipse 64 位 此后我尝试重新安装 Java 和
  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • 如何在流中收集到TreeMap中?

    我有两个Collectors groupingBy在流中 我需要收集所有信息TreeMap 我的代码 Map
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • 将 emoji 替换为适当的 java 代码

    我正在开发一个简单的java程序 它可以接受这样的字符串 停止 你违反了 法律 但是现在 你 并将每个表情符号替换为适当的 java 字符 我不知道该怎么称呼他们 这是一个例子 汽车表情符号 将替换为 uD83D uDE97 这允许我有一个
  • Java - 同步方法导致程序大幅减慢

    我正在尝试了解线程和同步 我做了这个测试程序 public class Test static List
  • org.hibernate.MappingException:没有 JDBC 类型的方言映射:1111

    我使用的是 postgres v8 3 它的列类型为 XML DDL 看起来像这样 CREATE TABLE contact ID INTEGER NOT NULL NAME VARCHAR NOT NULL Details XML 在映射
  • Java 泛型和数字类型

    我想创建一个通用方法来有效地执行此操作 class MyClass static
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 如何在 Ivy 中使用不同的分类器下载多个 Maven 依赖项?

    我试图依靠Neo4j 服务器 jar http repo neo4j org content repositories snapshots org neo4j app neo4j server 1 5 SNAPSHOT neo4j serv
  • WebSocketStompClient 将无法连接到 SockJS 端点

    我正在尝试新的 从版本 4 2 开始 java STOMP 客户端支持 我的出发点是入门指南 使用 WebSocket 构建交互式 Web 应用程序 http spring io guides gs messaging stomp webs
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i

随机推荐

  • sudo配置文件/etc/sudoers深入介绍

    简介 sudo命令对应的用户权限授权配置文件为 etc sudoers 我们可以使用专用工具visudo来完成有关sudo的授权管理配置 使用visudo工具的好处是在添加规则之后 保存退出时会检查授权配置的语法 这一点很重要 曾经有人直接
  • 理解矩阵 from孟岩--流星小屋

    理解矩阵 from孟岩 前不久chensh出于不可告人的目的 要充当老师 教别人线性代数 于是我被揪住就线性代数中一些务虚性的问题与他讨论了几次 很明显 chensh觉得 要让自己在讲线性代数的时候不被那位强势的学生认为是神经病 还是比较难
  • vscode 用git 拉取代码,提示:在签出前,请清理存储库工作树。请问是什么问题,如何解决

    问题主要是git仓库上的代码和本地代码存在冲突 解决办法 1 新建一个文件夹重新从git拉取最新的代码 使用beyond compare对比合并自己修改的代码到新拉的代码里 提交 2 放弃本地修改 直接覆盖 git reset hard g
  • Hadoop分布式文件系统(HDFS)Java接口(HDFS Java API)详细版

    误用聪明 何若一生守拙 滥交朋友 不如终日读书 相关连接 HDFS相关知识 Hadoop分布式文件系统 HDFS 快速入门 Hadoop分布式文件系统 HDFS 知识梳理 超详细 Hadoop集群连接 Eclipse连接Hadoop集群 I
  • Vant UI使用iconfont自定义图标

    在使用Vant UI做h5页面时 不可避免的会使用到各种小图标 但是Vant 官方提供的图标是有限的 考虑到这种情况 vant也提供了一种方法去自定义图标 自定义图标 可能有些同学看到这里也是一头雾水 下面有详细的教程 iconfont 让
  • 栈的逆序

    题目描述 实现一个栈的逆序 但是只能用递归函数和这个栈本身的pop操作来实现 而不能自己申请另外的数据结构 给定一个整数数组A即为给定的栈 同时给定它的大小n 请返回逆序后的栈 测试用例 输入 4 3 2 1 4 输出 1 2 3 4 解题
  • 伯德图 matlab,Matlab/Simulink中bode图的画法

    在Matlab中 大多时候 我们都是用M语言 输入系统的传递函数后 用bode函数绘制bode图对系统进行频率分析 这样做 本人觉得效率远不如Simulink建模高 如何在Matlab Simulink中画bode图 以前也在网上查过些资料
  • 《数据库系统概论(第5版)》课后习题答案 王珊、萨师煊编著版 课后题解析 高等教育出版社出版 答案与解析第二篇 第1章 课后答案与解析

    数据库系统概论 第5版 课后答案 数据库系统概论 第5版 课后习答案 王珊 萨师煊编著版 课后题解析 高等教育出版社出版 答案与解析 数据库系统概论 第5版 王珊 萨师煊编著版 第二篇 第1章 课后答案与解析 完整答案在页面最下方 前言 第
  • unity3D期末作业 开车游戏

    unity3D期末作业 开车游戏 文末附下载链接 游戏如下动态图 点我下载 https download csdn net download weixin 43474701 75857348
  • 代码运行时 CPU占用率100%的解决方法

    原因 建立连接后启动新的线程 如果线程中有简单粗暴的不含阻塞的while 1 循环 会持续占用CPU 导致CPU占用率极高 解决 在while 1 的大循环中插入一句sleep 1 即阻塞1毫秒 java线程内则使用Thread sleep
  • LeetCode【541】反转字符串 II

    题目 给定一个字符串和一个整数 k 你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转 如果剩余少于 k 个字符 则将剩余的所有全部反转 如果有小于 2k 但大于或等于 k 个字符 则反转前 k 个字符 并将剩余的字符保持原样
  • 数据集划分,Oxford Flower102花卉分类数据集,分为训练集、测试集、验证集

    数据集划分 Oxford Flower102花卉分类数据集 分为训练集 测试集 Oxford Flower102数据集链接 https www robots ox ac uk vgg data flowers 102 参考 https ww
  • R语言练习题答案(1)

    关注公众号凡花花的小窝 含有更多更全面的计算机专业编程考研相关知识的文章还有资料 第一章R语言概述 代码 1 1 install packages installr require installr load install load in
  • Midjourney 绘画关键词12000+,直接复制粘贴,让你轻松掌握AI绘画技巧!

    今天我要跟大家介绍一款非常实用的AI绘画工具 Midjourney 如果你是一名画家或设计师 你一定知道 画画是一件非常需要耐心和技巧的事情 但是有了Midjourney 你可以省去繁琐的绘制过程 快速创作出精美的作品 Midjourney
  • 尚医通项目(上)

    来自atguigu 视频链接 项目介绍 1 概述 尚医通即为网上预约挂号系统 旨在缓解看病难 挂号难的就医难题 随时随地轻松挂号 不用排长队 2 技术点 核心技术 SpringBoot 简化新Spring应用的初始搭建以及开发过程 Spri
  • 问题 1427: [蓝桥杯][2013年第四届真题]买不到的数目

    https www dotcpp com oj problem1427 html 题目描述 小明开了一家糖果店 他别出心裁 把水果糖包成4颗一包和7颗一包的两种 糖果不能拆包卖 小朋友来买糖的时候 他就用这两种包装来组合 当然有些糖果数目是
  • 【翻译】BItcoin数据结构——UTXO definition-Investopedia

    原文 https www investopedia com terms u utxo asp UTXO意味着什么 UTXO代表比特币交易的未花费的输出 每个比特币交易都以用于平衡分类账的硬币开始 UTXO会不断处理 并负责开始和结束每笔交易
  • word(doc,docx)转换为HTML

    maven
  • qt中的listwidget默认选中某行

    参考博客 Qt程序怎么实现选中ListWidget中的某一行为默认选中 我不是萧海哇 的博客 CSDN博客 qlistwidget选中某行 QListWidgetItem item ListWidget gt item 1 item gt
  • CountDownLatch CyclicBarrier 原理 总结

    参考链接 http ifeve com talk concurrency countdownlatch http www importnew com 15731 html https www cnblogs com nullzx p 527