【Java 并发编程】CountDownLatch 简介

简介: 【Java 并发编程】CountDownLatch 简介

文章目录

I CountDownLatch 概念

II CountDownLatch 使用流程

III CountDownLatch API 简介



I CountDownLatch 概念


1. 概念 : CountDownLatch ( 倒计时锁 ) 是 Java 并发编程中重要的 线程同步辅助工具类 , 其与 join 方法功能类似 , 其可以阻塞住一个或多个线程 , 等待在某些线程中执行想用的操作 , 将 CountDownLatch 倒计时计数到 0 时 , 这些被阻塞的线程才能继续向下执行 ;


2. 作用 : CountDownLatch 可以将一个或多个线程阻塞 , 并在另外一个或多个线程中将 CountDownLatch 计数器减为 0 , 被阻塞的线程解除休眠状态 , 继续执行 ;




II CountDownLatch 使用流程


1. 初始化 CountDownLatch : 初始化 new CountDownLatch ( 8 ) , 在构造函数中 , 为其指定一个初始值 , 从这个值开始倒计时计数 ; 这里设置了 8 计数 , 可以等待另外 8 个线程执行完毕后 , 在执行后续操作 ;


2. 阻塞 : 在若干线程 ( 一个或多个 ) 中调用同一个 CountDownLatch 对象的 await() 方法 , 即可将这些线程阻塞 ;


3. 计数减一 : 在其它非阻塞的线程中 , 执行操作 , 之后调用 CountDownLatch 对象的 countDown() 方法 , 该计数器的计数会减一 , 如果计数减到 0 , 在线程中的阻塞就会解除 ;


4. 阻塞结束 : 当调用 countDown 计数减到 0 之后 , 线程阻塞解除 , 继续执行 await() 方法之后的代码 ;




III CountDownLatch API 简介


1. 构造方法 : 初始化 CountDownLatch 对象 , 传入计数器初始计数 count , 其可以表示阻塞 count 个线程 ;


① 函数原型 :

public CountDownLatch(int count)


② 参数 int count : 初始计数 ;

2. 计数器递减方法 : 每次调用该方法 , CountDownLatch 对象计数器就会减一 , 如果计数器计数减到 0 , 就会解除其对于线程的阻塞 ;


① 函数原型 :

public void countDown()


② 当前计数大于 0 : 计数 - 1 , 如果减一后的计数为 0 , 那么该 CountDownLatch 对象阻塞的线程就会从阻塞处开始执行 ;

③ 桑倩计数等于 0 : 如果 CountDownLatch 对象的当前的计数是 0 , 那么不作任何操作 ;

3. 无参阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 之后该阻塞解除 ;


① 函数原型 :

public void await() throws InterruptedException


② 计数为 0 : 如果当前的 CountDownLatch 计数为 0 , 那么阻塞无效 , 继续执行之后的代码 ;

③ 计数大于 0 : 此时调用 await 方法 的线程阻塞 , 处于休眠状态 ;

④ 线程非运行状态 : 如果调用 await 方法的线程处于中断状态 , 或者在等待时被中断 , 抛出 InterruptedException 异常 ;

4. 带参数的阻塞方法 : 在线程 A 中调用该方法后 , 调用该方法的线程 , 线程 A 就会被阻塞住 ( 休眠 ) , 在 CountDownLatch 倒计时为 0 ( 计数 0 ) 或者超出了等待时间 ( 超时 ) 之后该阻塞解除 ; 该方法运行机制与无参类似 , 这里重点说明超时等待机制 ;


① 函数原型 :

public void await(long timeout, TimeUnit unit) throws InterruptedException


② 参数 long timeout : 阻塞操作要等待的最长时间 ;

③ 参数 TimeUnit unit : 等待时长的单位 , 一般是毫秒 ( ms ) ;


目录
相关文章
|
1月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
31 0
|
1月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
12天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
26天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
16天前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
50 12
|
13天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
93 2
|
29天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
29天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
50 3
|
2月前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
2月前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
37 1