关于CyclicBarrier的一些解释

2023-11-13

我在网上找了一些关于CyclicBarrier的一些解释

In a nutshell, just to understand key functional differences between the two :

public class CountDownLatch {
    private Object mutex = new Object();
    private int count;

    public CountDownLatch(int count) {
        this.count = count;
    }

    public void await() throws InterruptedException {
        synchronized (mutex) {
            while (count > 0) {
                mutex.wait();
            }
        }
    }

    public void countDown() {
        synchronized (mutex) {
            if (--count == 0)
                mutex.notifyAll();
        }

    }
}

and

public class CyclicBarrier {
    private Object mutex = new Object();
    private int count;

    public CyclicBarrier(int count) {
        this.count = count;
    }

    public void await() throws InterruptedException {
        synchronized (mutex) {
            count--;
            while(count > 0)
                mutex.wait();
            mutex.notifyAll();
        }
    }
}

except, of course, features like non-blocking, timed waiting, diagnostics and everything which has been in details explained in the above answers.

The above classes are, however, fully functional and equivalent, within the provided functionality, to their correspondent namesakes.

On a different note, CountDownLatch's inner class subclasses AQS, while CyclicBarrier uses ReentrantLock (my suspicion is it could be other way around or both could use AQS or both use Lock -- without any loss of performance efficiency)

 

还有notifyall()的解释

However (if I do understand the difference between these methods right), only one thread is always selected for further monitor acquisition.

That is not correct. o.notifyAll() wakes all of the threads that are blocked in o.wait() calls. The threads are only allowed to return from o.wait() one-by-one, but they each will get their turn.


Simply put, it depends on why your threads are waiting to be notified. Do you want to tell one of the waiting threads that something happened, or do you want to tell all of them at the same time?

In some cases, all waiting threads can take useful action once the wait finishes. An example would be a set of threads waiting for a certain task to finish; once the task has finished, all waiting threads can continue with their business. In such a case you would use notifyAll() to wake up all waiting threads at the same time.

Another case, for example mutually exclusive locking, only one of the waiting threads can do something useful after being notified (in this case acquire the lock). In such a case, you would rather use notify(). Properly implemented, you could use notifyAll() in this situation as well, but you would unnecessarily wake threads that can't do anything anyway.


In many cases, the code to await a condition will be written as a loop:

synchronized(o) {
    while (! IsConditionTrue()) {
        o.wait();
    }
    DoSomethingThatOnlyMakesSenseWhenConditionIsTrue_and_MaybeMakeConditionFalseAgain();
}

That way, if an o.notifyAll() call wakes more than one waiting thread, and the first one to return from the o.wait() makes leaves the condition in the false state, then the other threads that were awakened will go back to waiting.

https://stackoverflow.com/questions/4168772/java-concurrency-countdown-latch-vs-cyclic-barrier

https://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again

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

关于CyclicBarrier的一些解释 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 分享6个对象数组去重的方法

    大家好 关于对象数组去重的业务场景 想必大家都遇到过类似的需求吧 针对这样的需求 你是怎么做的呢 下面我就先和大家讨论下基于对象的某个属性如何去重 方法一 使用 filter 和 findIndex 相结合的方法 使用 filter 方法过
  • 程序员编程设计思维

    设计 设计工作 无论软件工程中的哪一个步骤 工作的开展都是为了解决一些实际问题 架构设计 子系统设计 功能模块设计 甚至类的设计 这些都是设计工作 原则 设计工作的开展是在一定的环境下进行 有很多的耳熟能详的规范或者原则 可扩展 高可用 高
  • 第五届河南省CCPC河南省省赛题解+复盘

    第五届河南省CCPC河南省省赛题解 复盘 今年省赛相当有意思的一点 是20级第一次线下省赛 对于部分队也可能是最后一次 看队名就能看出来很多 考研就业的选手 一群老年人在这PK 氛围挺不错 A 小水獭游河南 签到 这个题关键点就是 知道a串
  • pip常用功能汇总

    1 安装指定版本的package pip install keras 2 1 0 安装指定版本 2 升级package到指定版本 pip install upgrade keras 2 1 0 3 安装package到指定位置 pip in
  • Elasticsearch 的增删改查

    ES概念 Elasticsearch是一个开源的搜索引擎 分布式的实时文件存储 可以处理PB级结构化或非结构化数据 我们可以通过简单的RESTful API来完成各种操作 全文搜索 Full text Search 全文检索是指计算机索引程
  • 「考生说」不拼爹、不拼妈,拼自己,一样过的好

    哈佛图书馆凌晨四点半仍灯火通明 座无虚席 很多哈佛学生为了学业甚至通宵达旦的学习 球星科比的名言 你知道洛杉矶凌晨四点钟是什么样子吗 他们都能被称之为成功人士 但是他们依旧在大家看不见的地方默默努力着 那为什么我们依旧还在羡慕着那些拼爹 拼
  • pclpy有序点云的中值滤波:使用Python进行有序点云滤波

    pclpy有序点云的中值滤波 使用Python进行有序点云滤波 有序点云是一种在三维空间中按顺序存储的点集合 在许多应用中 需要对有序点云进行滤波以去除噪声和异常值 中值滤波是一个常用的方法 它可以有效地去除离群点 并且保持点云的形状不变
  • 寒假小复习4

    冒泡排序 public class Sort public static void main String args double nums 1 66 73 41 30 1 double temp for int i 0 i lt nums
  • 深入springMVC

    HTML 页面中的表单最初所采用 application x www form urlencode 编码方式 并不满足文件上传的需要 所以 RFC 1867 在此基础上增加了新的 multipart form data 编码方式以支持基于表
  • LRU算法(JAVA实现)

    一 算法介绍 最近最久未使用 Least Recently Used LRU 算法是 种缓存淘汰策略 它是大部分操作系统为最大化页面命中率而广泛采用的一种页面置换算法 该算法的思路是 发生缺页中断时 将最近一段时间内最久未使用的页面置换出去
  • Java static——拾遗

    Java static 拾遗 Java Static 作为修饰符 可以用来修饰变量 方法 代码块 但绝对不能修饰类 1 修饰变量 类的所有对象共同拥有的一个属性 也称为类变量 这类似于C语言中的全局变量 类变量在类加载的时候初始化 而且只被
  • Jenkins添加用户并授权

    添加用户 先选择系统管理1 再在右侧选择2 例如 注意 之后点击保存按钮 如果没有角色先去添加角色 设置完毕一般等待几分钟才可登录查看自己的功能权限 太早登录没任何功能
  • Excel下拉框样式

    1 打开要修改的Excel 选中要修改样式的单元格 2 在上边导航栏中选择 Data 找到 Data Validation 点击下面的 Data Validation 3 在设置中找到 Allow 项 选择 List Source中填写可供
  • 运行mvn -v后出现“cmd 不是内部或外部命令,也不是可运行的程序"

    1 下载maven 官网下载地址 http maven apache org download cgi 2 解压到软件安装目录 比如我解压到E java apache maven 3 5 0 bin apache maven 3 5 0 3
  • mysql中分组取创建时间最新的数据

    近期由于公司数据库升级 遇到了一个问题 以前写的SQL语句查询结果出现了异常 sql实现的功能 将数据以PID进行分组 在组内获取创建时间最新的数据 项目数据比较敏感写了一些测试数据 执行的sql语句 select from select
  • Android中使用jiecaovideoplayer播放视频

    每天学一点2020 5 13 Android 2 Android中使用jiecaovideoplayer播放视频 1 添加依赖 2 添加运行时的权限 3 布局 4 JCVideoPlayer使用 5 设置视频 Android中使用jieca
  • moviepy使用教程

    moviepy使用教程 一 剪辑成果 二 遇到问题 三 moviepy方法分享 一 音频剪辑方法 二 视频剪辑方法 一 剪辑成果 未来 二 遇到问题 尝试使用ffmpeg moviepy pydub 其中pydub主要是对音频的处理 mov
  • @Transactional注解的方法之间调用事务是否生效及其他事务失效场景总结

    对于方法之间调用 注解 Transaction生效以及失效的场景 首先 我们需要知道 Spring是通过代理管理事务的 方法和方法之间的调用分为两种情况 解决办法可在下面列举的不同场景中自取 1 不同类之间的方法调用 如类A的方法a 调用类
  • 三、python基础——六大基本数据类型

    目录 六大标准数据类型 1 数字 Number 不可变 1 1 数值的运算 2 字符串 String 不可变 2 1 介绍 2 2 操作 2 2 1 切片 2 2 2 转义字符 3 列表 List 3 1 介绍 3 2 操作 3 2 1 索
  • 关于CyclicBarrier的一些解释

    我在网上找了一些关于CyclicBarrier的一些解释 In a nutshell just to understand key functional differences between the two public class Co