博客
关于我
Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)
阅读量:538 次
发布时间:2019-03-09

本文共 1933 字,大约阅读时间需要 6 分钟。

CyclicBarrier 的浅度入门与深度探索

CyclicBarrier 是 Java 并发编程中的一个强大机制,它用于管理多线程的协调性。通过本文,我们将逐步解析 CyclicBarrier 的功能、使用流程以及与 CountDownLatch 的区别。

CyclicBarrier 的基础知识

CyclicBarrier(循环栅栏)和 CountDownLatch(闭锁)类似,它也用于等待一组事件的完成。但与闭锁不同,CyclicBarrier 的目标是等待一定数量的线程同时到达栅栏位置。这种设计使其在多个阶段的协调任务中表现尤为突出。

CyclicBarrier 的核心理念是:所有参与等待的线程必须同时到达栅栏位置,才能继续执行任务。这种机制特别适用于多线程任务中需要多个子线程等待并达到某一共同状态后才能进行的阶段。

CyclicBarrier 的工作流程

  • 线程到达栅栏位置并调用 await 方法:当线程到达栅栏位置时,会调用 await 方法,进入等待状态,直到所有线程到达栅栏位置。

  • 所有线程到达栅栏位置:待所有线程到达栅栏后,栅栏将打开,所有线程获得继续执行的权限。

  • 执行 barrierAction:栅栏打开后,会自动执行提供给 CyclicBarrier 的 Runnable 任务(如果有的话)。

  • 计数器重置:任务完成后,栅栏会重置计数器,为下一轮等待做好准备。

  • 这个流程使得 CyclicBarrier 能够在多个阶段中循环使用,支持多线程任务的多阶段执行。

    CyclicBarrier 的典型应用场景

    以客户管理系统为例:假设有五个用户同时登录系统。系统需要确保所有用户同时完成认证后才能进入下一阶段。通过 CyclicBarrier,可以实现所有用户同时到达某个节点的需求。

    更具体地说,以旅游预订为例:每一天的旅游团安排需要大家同时集合、同时出发。如果使用闭锁(CountDownLatch),只适合一次性等待所有线程完成任务。而 CyclicBarrier 则可以用于多次等待,例如每天每次出发前的集合,或者从目的地返回后再次集合。

    CyclicBarrier 的实现原理

    CyclicBarrier 实现的核心在于 dowait 方法,它通过独占锁 implements ReentrantLock 来保证并发性,同时采用计数器 (count) 来跟踪等待的线程数量。计数器将被减少到0,表示所有线程已到达栅栏位置。

    count 减少到0,表示最后一个线程已经到达栅栏。此时,会执行 barrierAction 并重置计数器,进入下一轮等待。

    如果不是最后一个线程到达,dowait 方法会从等待队列中获取下一个线程继续等待。通过自旋的方式,线程不会被CPU处于死循环状态。

    CyclicBarrier 与 CountDownLatch 的区别

  • 计数器的使用:CountDownLatch 的计数器只能递减到0,无法循环使用。而 CyclicBarrier 的计数器可以重置,支持多次使用。

  • 核心作用:CountDownLatch 用于等待一组线程完成某个任务。而 CyclicBarrier 用于等待一组线程同时到达某个点。

  • 方法扩展:CyclicBarrier 提供了更多有用的方法,如 getNumberWaiting() 用于获取等待的线程数和 isBroken() 用于检查栅栏是否损坏。

  • CyclicBarrier 的不足之处

    唯一的不足在于 dowait 方法使用了独占锁,这在并发程度高的场景下可能不高效。但这也是保证线程安全的必要手段。

    代的区分作用

    CyclicBarrier 使用了代的概念,通过 generation 来区分不同的等待阶段。这种设计能确保线程正确识别是属于哪一轮等待,从而保证任务的正确执行。

    如何正确使用 CyclicBarrier

  • 合理设计线程数量:确保线程的数量与实际任务需求相匹配。过多的线程会导致资源浪费,而过少的线程将影响性能。

  • 正确配置 barrierAction:如果需要在所有线程到达栅栏后的执行操作,可为 CyclicBarrier 传递一个 Runnable 实例。

  • 处理栅栏损坏情况:如果因某个线程强制中断或出现意外,CyclicBarrier 可通过 reset() 方法重新初始化,确保后续任务继续进行。

  • 总结

    CyclicBarrier 是 Java 并发编程中处理多线程协调任务的强大工具。它的循环特性和灵活性使其在多阶段任务中发挥重要作用。通过理解 CyclicBarrier 的工作原理和应用场景,开发者能够更好地设计高效的并发任务解决方案。

    转载地址:http://axisz.baihongyu.com/

    你可能感兴趣的文章
    微软云Linux服务器 Mysql、tomcat远程连接错误解决办法
    查看>>
    Python数据分析(二): Numpy技巧 (2/4)
    查看>>
    09 . Python3之常用模块
    查看>>
    Python学习笔记-StatsModels 统计回归(3)模型数据的准备
    查看>>
    Velocity.js初步
    查看>>
    yarn出现“There are no scenarios ; must have at least one"
    查看>>
    nginx上配置phpmyadmin
    查看>>
    HustOJ二次开发之修改数据库连接池
    查看>>
    redis集群报错:(error) CLUSTERDOWN Hash slot not served
    查看>>
    一个JAVA应用启动缓慢问题排查 --来自jdk securerandom 的问候
    查看>>
    spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
    查看>>
    httprunner学习23-加解密
    查看>>
    有道云笔记 同步到我的博客园
    查看>>
    阿里云“网红"运维工程师白金:做一个平凡的圆梦人
    查看>>
    李笑来必读书籍整理
    查看>>
    vue书籍整理
    查看>>
    记Java中有关内存的简单认识
    查看>>
    http头部 Expect
    查看>>
    Hadoop(十六)之使用Combiner优化MapReduce
    查看>>
    《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
    查看>>