CyclicBarrier源码浅析

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端 最近电脑重新安装系统,开发环境和软件都需要重新安装和配置,其中终端工具是必不可少的,正好利用这个机会,介绍一下 macOS 终端神器 iTerm2 的安装和配置,并推荐几款好用的插件和工具。在IT领域中,工具的选择和使用对于开发者和运维人员来说至关重要。而在众多终端模拟器中,ITerm2无疑是一个出色的选择,希望本篇的文章能对你有些帮助,感兴趣的朋友可以登录官网查看官方文档。我是刘大大,持续分享AI相关领域的知识和工具,喜欢点点关注。 阅读详情

目录

简述

成员变量

等待解除阻塞

重置

获取当前阻塞的线程个数


简述

阻塞多个线程,直到阻塞的线程个数达到一定条件,则唤醒所有阻塞的线程,并由唤醒的线程执行任务。

 

成员变量

    // 用于线程安全的锁
    private final ReentrantLock lock = new ReentrantLock();
    // 等待条件
    private final Condition trip = lock.newCondition();
    // 需要触发解除阻塞的线程总数
    private final int parties;
    // 解除阻塞时运行的任务
    private final Runnable barrierCommand;
    /** The current generation */
    private Generation generation = new Generation();
    // 用于记录当前剩余触发解除线程阻塞的个数
    private int count;

 

等待解除阻塞

    public int await() throws InterruptedException, BrokenBarrierException {
        try {
            return dowait(false, 0L);
        } catch (TimeoutException toe) {
            throw new Error(toe); // cannot happen
        }
    }

    public int await(long timeout, TimeUnit unit)
        throws InterruptedException,
               BrokenBarrierException,
               TimeoutException {
        return dowait(true, unit.toNanos(timeout));
    }

 

dowait方法

    private int dowait(boolean timed, long nanos)
        throws InterruptedException, BrokenBarrierException,
               TimeoutException {
        final ReentrantLock lock = this.lock;
        lock.lock(); // 锁住
        try {
            final Generation g = generation;

            if (g.broken)
                throw new BrokenBarrierException();

            if (Thread.interrupted()) {
                breakBarrier();
                throw new InterruptedException();
            }

	    // 更新count
            int index = --count;
			
	    // 如果当前调用await方法的线程个数满足count,执行barrierCommand任务,并唤醒所有等待的线程
            if (index == 0) {  // tripped
                boolean ranAction = false;
                try {
                    final Runnable command = barrierCommand;
                    if (command != null)
			// 执行任务
                        command.run();
                    ranAction = true;
		    // 唤醒在条件等待队列的所有线程
                    nextGeneration();
                    return 0;
                } finally {
                    if (!ranAction)
                        breakBarrier();
                }
            }

            // loop until tripped, broken, interrupted, or timed out
	    // 如果不满足个数,则循环等待直到被唤醒
            for (;;) {
                try {
                    if (!timed) // 不是超时等待
                        trip.await(); // 加入条件等待队列
                    else if (nanos > 0L) // 是超时等待,且还未到限时的时间
                        nanos = trip.awaitNanos(nanos); // 加入条件等待队列
                } catch (InterruptedException ie) {
                    if (g == generation && ! g.broken) {
                        breakBarrier();
                        throw ie;
                    } else {
                        // We're about to finish waiting even if we had not
                        // been interrupted, so this interrupt is deemed to
                        // "belong" to subsequent execution.
                        Thread.currentThread().interrupt();
                    }
                }

                if (g.broken)
                    throw new BrokenBarrierException();

                if (g != generation)
                    return index;

		// 如果设置了超时等待且超时
                if (timed && nanos <= 0L) {
                    breakBarrier();
                    throw new TimeoutException();
                }
            }
        } finally {
            lock.unlock(); // 解锁
        }
    }

    private void nextGeneration() {
        // signal completion of last generation
	// 唤醒所有等待的线程
        trip.signalAll();
        // set up next generation
	// 重置count
        count = parties;
        generation = new Generation();
    }

 

重置

    public void reset() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            breakBarrier();   // break the current generation
            nextGeneration(); // start a new generation
        } finally {
            lock.unlock();
        }
    }

 

获取当前阻塞的线程个数

    public int getNumberWaiting() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            return parties - count;
        } finally {
            lock.unlock();
        }
    }

 

AI基础入门(大模型基础篇)——技术视角:你应该知道的LLM基础知识 本文从技术视角解析了大模型的工作原理,主要介绍了三个核心概念:Token、温度和Embedding。首先,大模型通过逐个添加Token来生成文本,Token数量直接影响上下文窗口大小和计费标准。其次,通过引入温度参数控制随机性,温度越高输出越多样化。最后,解释了字符串如何通过One-Hot编码和神经网络压缩转化为向量形式的Embedding,这是AI处理各类输入的基础。这些概念对理解大模型应用开发至关重要,Token决定处理能力,温度影响输出风格,Embedding则是信息转换的关键步骤。 阅读详情

相关推荐

OpenCV透视变换实战:5分钟搞定歪斜证件照矫正(附完整代码)

本文详细介绍了如何使用OpenCV的透视变换技术快速矫正歪斜证件照,包含完整的Python代码实现。通过特征检测、坐标计算和矩阵变换三个核心步骤,5分钟内即可将手机拍摄的歪斜图像自动矫正为专业级证件照,大幅提升图像处理效率。

weixin_29094979的博客 481

Java之CyclicBarrier使用

1、类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 2、使用场景: 需要所有的子任务都完成时,才执行主任务,这个时候就

shihuacai的专栏 3万+

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案

本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。

weixin_34718952的博客 388

Java并发编程之CyclicBarrier详解

简介栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏...

Stay Hungry, Stay Foolish 6万+

WiFi偏门协议(四):增强的传输机制802.11aa

区分Unicast和Multicast的优先级,以及设定不同的重传次数,以细化EDCA机制。 SCS(StreamClassification Service) 如上图,在VI,VO内各自又增加了一个queue, 对应不同的MAC header。VI和VO内的两个queue可以分别对应UC和MC。这样就提供了同一个AC内的更细粒度的优先级区分。当然还可以使用Drop Eligibility Indication子域来区分不同的重传次数。 改善Multicast数据传...

reekyli的专栏 1790

redhawk:avgTW maxTW minTW minWC的区别

分析dynamic ir drop报告时会遇到这几个值,avgTW maxTW minTW minWC,如下图。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 690

CyclicBarrie(循环栅栏)的作用与用法

CyclicBarrie的作用与用法 一、CyclicBarrie的作用 CyclicBarrier循环栅栏(循环屏障)是一个多线程同步的辅助工具类,它允许一组线程在到达某个等待屏障点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达等待屏障点,屏障才会打开,之前处于阻塞状态的线程才能恢复继续执行.它非常适用于一组线程之间必需经常互相等待的情况。 CyclicBarrier从字面理解是循环的栅栏,之所以称之为循环的是因为在等待线程释放后,该栅栏还可以复用。后面我们代码中会进

狗狗大蛇 1951

损失函数大汇总(八)(IoU Loss附公式推导与代码)

本文详细介绍了IoU Loss及其在图像分割中的应用。IoU(交并比)是衡量预测区域与真实区域重叠程度的指标,IoU Loss定义为1-IoU,直接优化区域重叠质量。文章推导了IoU的数学表达式和梯度计算,分析了其函数特性:全局耦合梯度、对漏检误检的双重惩罚、适合类别不平衡任务。与Dice Loss相比,IoU更强调覆盖质量而非相似度。实际应用中IoU Loss常与BCE组合使用,前者保证训练稳定性,后者优化整体区域质量。文章还提供了IoU Loss的代码实现,适用于二值分割、小目标提取等场景,特别当任务评

悦学共鸣,温柔以待,汇聚光芒,共同成长 413

读CyclicBarrier源码

[code="java"] //一个循环的屏障。所有的线程在屏障处等待其他线程执行完毕。然后再各自执行。 //先看构造函数 public CyclicBarrier(int parties) { this(parties, null); } //barrierAction代表在屏障上等待的最后一个线程已经执行完后,执行的runnable public...

一木一草一枯荣 278

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4895

PyQt5简介和安装

在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。

XdKwargs的博客 222

CyclicBarrier源码分析

字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。 其实它和countDownLatch很类似,也是个计数器。 但他有两个优点: 1.一个他的计数器能复用,而countDownLatch减到...

wang__wang666的博客 229

工业相机的检测原理课件(建议收藏)

本课件为各位工程师详细介绍了工业相机的视觉检测原理 ,旨在为工程师调试工业相机的视觉检测原理时提供理论性指导。

Bamboo265925的博客 498

【源码】JUC —— CyclicBarrier 浅析

【源码】JUC —— CyclicBarrier 浅析前言JDK 版本CyclicBarrierawait其他demo总结 前言 CyclicBarrier ,CountDownLatch 的 plus 版。在 CountDownLatch 的基础上,允许 循环使用,指定数量的线程被唤醒后,将再次进入下一轮阻塞、唤醒 允许指定一个 Runnable,在唤醒阻塞线程前执行 与 CountDownLatch 略有不同的是,不用显示的“倒计时”,而是在阻塞线程数达到 阈值 时直接唤醒该批线程 关于 Coun

小水牛的博客 229

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Chapter 9 浅析CyclicBarrier类

1 概述 和CountDownLatch类相似,CyclicBarrier类是Java的j.u.c包中的一个线程同步的辅助类,其主要功能是让一组线程互相等待,直到抵达某个公共屏障点,这个障碍点(即barrier)也可以称为同步点。由于这个barrier在释放等待线程后可以被重用,因此被称为循环的,即cyclic。 2 典型应用 CyclicBarrier类的典型应用场景是这样的:

skuxeqrsjnxdo596的博客 294

【JAVA】CyclicBarrier源码解析以及示例

在多线程编程中,同步工具是确保线程之间协同工作的重要组成部分。(循环屏障)是Java中的一个强大的同步工具,它允许一组线程在达到某个共同点之前互相等待。在本文中,我们将深入探讨的源码实现以及提供一些示例,以帮助您更好地理解和应用这个有趣的同步工具。通过本文,我们深入了解了的源码实现,并通过一个简单的示例演示了它的用法。是一个强大的同步工具,可以帮助我们实现复杂的多线程协同任务。在多线程编程中,理解和熟练使用这样的同步工具是至关重要的,能够确保线程之间的协同工作更加高效和可靠。😊🙏。

Venus's Blog 2万+

CyclicBarrier 深入源码解析

  CyclicBarrier意为“循环栅栏”,是一个可循环利用的屏障。CyclicBarrier可以使指定数量线程到达阻塞点后继续后续任务。   演示示例:   首先,新建一个线程类,用于模拟多线程环境。 package com.securitit.serialize.juc; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierThread extends Thread { // CyclicBarrier实例.

键盘上流淌的日子 8261

CyclicBarrier源码解析

目录1. 简介2. 简单使用3. 源码解析3.1 成员变量3.2 构造方法3.3 成员方法3.3.1 await方法3.3.2 dowait方法3.3.3 breakBarrier方法3.3.4 nextGeneration方法4. 总结 1. 简介 CyclicBarrier的字面意思是可循环使用的屏障,与CountDownLatch最明显的区别是CyclicBarrier是可循环的屏障,而CountDownLatch是只能使用一次的屏障。CyclicBarrier,回环栅栏,只有当一定数量的线程都到达才

qq_50313418的博客 3114

CyclicBarrier使用及源码讲解

从名字上来看CyclicBarrier,就是代表。CyclicBarrier一般被称为栅栏。:让一个或多个线程达到一个屏障点,会被阻塞。屏障点会有一个数值,当达到一个线程阻塞在屏障点时,就会对屏障点的数值进行-1操作,当屏障点数值减为0时,屏障就会打开,唤醒所有阻塞在屏障点的线程。在释放屏障点之后,可以先执行一个任务,再让所有阻塞被唤醒的线程继续之后后续任务。:所有线程被释放后,屏障点的数值可以再次被重置。CyclicBarrier是一种同步机制,允许一组线程互相等待。

javaeEEse的博客 1167

CyclicBarrier源码阅读

CountDownLatch:将线程分为执行者和等待者CyclicBarrier:执行者和等待者都是同一批线程如何理解呢,CountDownLatch大家都知道,设置一批工作线程,各自执行完任务就调用CountDownLatch.countDown,表示自己已经执行完任务,该工作线程就可以继续干别的事情了。而CyclicBarrier相当于在CountDownLatch.countDown之后设置了一道屏障,自己完成了任务后,还得等别的工作线程也完成了之后才能继续干别的事情。

qq_36769368的博客 898

CyclicBarrier(循环屏障)源码解读与使用

CyclicBarrier可以让一组线程互相等待,直到最后一个线程也准备就绪后,它们才能继续运行。就好比几个朋友约好一起吃晚餐,必须等到所有人到齐后才能入座就餐。CyclicBarrier实现了这种"集体出发"的功能,每次所有线程就位后,它们可以执行一个预先指定的任务,然后继续向前推进。有趣的是,CyclicBarrier与CountDownLatch不同,它可以重复使用。这也从侧面体现了两者在设计理念上的差异。借鉴了AQS的精髓,CyclicBarrier内部通过ReentrantLock和Con

qq_35716689的博客 8276

CyclicBarrier的源码分析

CyclicBarrier基于 ReentrantLock + ConditionObject实现,CyclicBarrier的构造函数中必须指定parties,同时对象generation,内部持有布尔型属性表示当前CyclicBarrier执行过程中是否有超时、异常、中断的情况。parties是初始待执行线程数,在构造函数中会将parties赋给计数值count,每当一个线程执行await(),count就会减1。

输入知识,消化知识,输出知识,分享知识,教人让我学习更好,业精于勤荒于嬉,行成于思毁于随 993

CyclicBarrier源码解析以及示例

概念 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行 源码分析 构造函数 设置parties、count及barrierCommand属性 public CyclicBarrier(int parties) { this(parties, null); } //当await的数量到达了设定的数量后,首先执行该Runnable对象。 public CyclicB

Venus's Blog 4万+

【第七篇】CyclicBarrier源码解析与应用详解【重点】

1.1 概述   CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。   CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。 1.2 源码解析 首先,Cycl

ᶻᶻᶻ 枕星河的博客 1461
上一篇: Retrofit源码浅析
下一篇: CountDownLatch源码浅析
Sun_Jingjing
博客等级 码龄10年 1粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值