博客
关于我
狂神JUC——CountDownLatch,CyclicBarrier,Semaphore
阅读量:511 次
发布时间:2019-03-07

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

CountDownLatch、CyclicBarrier与Semaphore:A Java多线程同步技术分析

在Java多线程编程中,CountDownLatch、CyclicBarrier以及Semaphore是三大核心的同步控制工具,它们各自在不同场景下发挥着重要作用。本文将从理论与实践角度,分析这三者各自的特点及其应用场景,并通过实际代码示例展示它们的使用方法。

CountDownLatch

CountDownLatch 是一个可重入同步机制,允许多个线程在不同的时间点等待基准事件完成。一旦基准事件发生,所有等待的线程都会立即被唤醒,并继续执行后续任务。

以下是一个典型的用法示例:

public static void main(String[] args) throws InterruptedException {    CountDownLatch countDownLatch = new CountDownLatch(5);    for (int i = 1; i <= 6; i++) {        new Thread(() -> {            System.out.println(Thread.currentThread().getName() + "go out");            try {                countDownLatch.await();            } catch (InterruptedException e) {                e.printStackTrace();            }        }, String.valueOf(i)).start();    }    countDownLatch.await();    System.out.println("Close Door");}

运行结果显示,所有线程均正确执行,门禁系统按预期关闭。


CyclicBarrier

CyclicBarrier 是一种允许多个线程组成的循环关卡,支持线程在一系列阶段间幕间等待。有时称为" Barney doors",其原理是所有线程必须完成指定阶段后才能继续下一阶段任务。

一个典型的应用示例如下:

public static void main(String[] args) {    CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {        System.out.println("Summon Dragon");    });    for (int i = 1; i <= 7; i++) {        final int temp = i;        new Thread(() -> {            System.out.println(Thread.currentThread().getName() + "Collect第" + temp + "个龙珠");            try {                cyclicBarrier.await();            } catch (InterruptedException e) {                e.printStackTrace();            } catch (BrokenBarrierException e) {                e.printStackTrace();            }        }, String.valueOf(i)).start();    }}

运行结果表明,所有线程正确地收集了所有的龙珠。


Semaphore

Semaphore 是一个信号量机制,用于限制并发访问共享资源。它通过颗粒式许可证来管理共享资源的访问数量,确保线程不会无限制地抢占资源。

一个典型的代码案例:

public static void main(String[] args) {    Semaphore semaphore = new Semaphore(3);    for (int i = 1; i <= 6; i++) {        new Thread(() -> {            try {                semaphore.acquire();                System.out.println(Thread.currentThread().getName() + "抢到车位");                TimeUnit.SECONDS.sleep(2);                System.out.println(Thread.currentThread().getName() + "离开车位");            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                semaphore.release();            }        }, String.valueOf(i)).start();    }}

运行结果显示,前三线程成功抢到车位,后续线程会依次等待进入。


这些同步机制在多线程开发中的应用场景各有不同。选择合适的工具依赖于具体任务需求,了解它们的工作原理和使用方法是成功应用的关键。

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

你可能感兴趣的文章
PowerShell攻击工具Nishang实战
查看>>
PowerShell攻击工具PowerSploit实战
查看>>
Powershell管理系列(四)Lync server 2013 批量启用语音及分配分机号
查看>>
PowerShell脚本运行完 不要马上关闭用什么命令可以停留窗口窗口
查看>>
PowerShell远程连接到Windows
查看>>
power(8) identity
查看>>
POW的重力之美
查看>>
PO、VO、DAO、BO、DTO、POJO能分清吗?
查看>>
pytorch介绍-ChatGPT4o作答
查看>>
PP-PLL:基于概率传播的部分标签学习
查看>>
pytorch介绍
查看>>
pprint 排序字典但不是集合?
查看>>
pptp拨号上网
查看>>
ppt上的倒计时小工具_PPT中有哪些「看似很 LOW,实则惊艳」的小工具
查看>>
PPT添加视频的路径问题
查看>>
PPT美化插件 islide 安装过程问题“加载com加载项时运行出现错误”
查看>>
Prefix Tuning:详细解读Optimizing Continuous Prompts for Generation
查看>>
PreparedStatement 与Statement 的区别,以及为什么推荐使用 PreparedStatement ?
查看>>
PreparedStatement 查询 In 语句 setArray 等介绍。
查看>>
presentModalViewController显示半透明的一个view
查看>>