CountDownLatch简介

news/2024/10/5 6:32:36/

引言

在多线程编程中,线程之间的协调和同步是一个常见的需求。Java 提供了多种工具来实现这一目标,其中 CountDownLatch 是一种简单而强大的同步机制。本文将详细介绍 CountDownLatch 的概念、使用方法和实际应用场景。

1. CountDownLatch 概述

CountDownLatchjava.util.concurrent 包中的一个类,用于在多线程环境下实现一种简单的计数器。当计数器的值到达零时,所有等待的线程都会被释放。它通常用于等待其他线程完成一组操作,然后再继续执行。

2. CountDownLatch 的基本使用

2.1 初始化

CountDownLatch 在初始化时需要指定一个正整数,表示计数器的初始值。这个值一旦设定,就无法再修改。

java">CountDownLatch latch = new CountDownLatch(3);
2.2 主要方法
  • await():使当前线程在计数器到达零之前一直等待。
  • countDown():将计数器的值减一。如果计数器的值减到零,所有等待的线程将被释放。

3. 示例代码

以下是一个使用 CountDownLatch 的示例代码,模拟了一个场景:主线程等待其他三个工作线程完成各自的任务,然后再继续执行。

java">import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) {final int threadCount = 3;CountDownLatch latch = new CountDownLatch(threadCount);for (int i = 0; i < threadCount; i++) {new Thread(new Worker(latch)).start();}try {// 主线程等待latch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("All workers have finished their tasks. Main thread continues.");}static class Worker implements Runnable {private CountDownLatch latch;public Worker(CountDownLatch latch) {this.latch = latch;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is working...");try {// 模拟工作Thread.sleep((int) (Math.random() * 1000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " finished work.");latch.countDown(); // 任务完成,计数器减一}}
}

4. CountDownLatch 的实际应用场景

  • 并行任务的协调:在处理需要分阶段完成的任务时,可以使用 CountDownLatch 来确保所有子任务都完成后再进行下一阶段的操作。
  • 服务启动顺序控制:在微服务架构中,可以使用 CountDownLatch 来确保所有依赖服务都已启动,然后再启动主服务。
  • 测试并发代码:在测试并发代码时,可以使用 CountDownLatch 控制多个线程同时开始执行某段代码,以观察其在高并发情况下的表现。

5. CountDownLatch 的优缺点

优点
  • 简单易用CountDownLatch 的 API 简单明了,使用方便。
  • 灵活性:可以用于各种需要线程同步的场景。
  • 线程安全CountDownLatch 是线程安全的,内部使用 AtomicInteger 确保计数器的正确性。
缺点
  • 一次性使用CountDownLatch 的计数器不能重置,因此它是一次性的。一旦计数器到达零,CountDownLatch 对象就不能再使用。
  • 功能有限:对于需要更复杂的线程同步机制,可能需要使用其他同步工具(如 CyclicBarrierSemaphore)。

结论

CountDownLatch 是 Java 并发包中一个简单而强大的工具,用于实现多线程之间的协调和同步。通过使用 CountDownLatch,可以方便地控制一组线程的执行顺序,确保在某些线程完成之前,其他线程一直等待。


http://www.ppmy.cn/news/1473760.html

相关文章

Python 函数递归

以下是一个使用递归计算阶乘的 Python 函数示例 &#xff1a; 应用场景&#xff1a; 1. 动态规划问题&#xff1a;在一些需要逐步求解子问题并利用其结果的动态规划场景中&#xff0c;递归可以帮助直观地表达问题的分解和求解过程。 2. 遍历具有递归结构的数据&#xff1a;如递…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…

使用kali Linux启动盘轻松破解Windows电脑密码

破解分析文章仅限用于学习和研究目的&#xff1b;不得将上述内容用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。谢谢&#xff01;&#xff01; 效果展示&#xff1a; 使用kali Linux可以轻松破解Windows用户及密码 准备阶段&#xff1a; &#xff08…

架构师应该在团队中发挥怎样的作用?

架构师分为5种&#xff1a; 1.企业架构师EA(Enterprise Architect) EA的职责是决定整个公司的技术路线和技术发展方向。 2.基础结构架构师IA(Infrastructure Architect) IA的工作就是提炼和优化技术方面积累和沉淀形成的基础性的、公共的、可复用的框架和组件&#xff0c;这…

【学习笔记】程序设计竞赛

程序设计竞赛 文章目录 程序设计竞赛0x00 基本操作指南0x01 算法分析0x02 STL和基本数据结构栈队列集合map 0x03 排序插入排序归并排序&#xff08;Merge Sort)快速排序 0x04 搜索技术BFSDFS回溯与剪枝 深度迭代ID A*A star双向广搜 0x05 递推方程0x06 高级数据结构并查集二叉树…

基于Vue,mysql,JavaEE的简单投票与投票管理系统

项目介绍 ​ 本项目&#xff0c;基于Vue2.6,mysql,JavaEE 实现简单的投票与投票管理系统 项目地址 VotingSystem: 投票系统1.0 管理员和普通用户 (gitee.com) 有问题请评论私聊哦 项目分类 数据库 创建投票人&#xff0c;被投票人&#xff0c;投票关系&#xff08;追踪谁…

Python中异步事件触发

1、问题背景 在Python中&#xff0c;我想创建一个由事件生成控制流程的类结构。为此&#xff0c;我做了以下工作&#xff1a; class MyEvent: EventName_FunctionName {}classmethoddef setup(cls, notificationname, functionname):if notificationname in MyEvent.EventN…

性能优化秘籍:WebKit 处理 CSS 选择器的高效策略

性能优化秘籍&#xff1a;WebKit 处理 CSS 选择器的高效策略 在现代网页的绚丽舞台上&#xff0c;CSS 选择器是构建视觉盛宴的画笔。然而&#xff0c;随着网页复杂度的日益增加&#xff0c;CSS 选择器的性能问题逐渐浮出水面。WebKit&#xff0c;作为众多先进浏览器的渲染引擎…