`

CountDownLatch/CyclicBarrier

阅读更多

CountDownLatch:

功能:是一个同步工具类 ,它允许一个或多个线程一直等待(通过调用await进入),直到其他线程的操作执行完(调用countDown)后再唤醒继续执行。

 

CountDownLatch维护一个状态 count值,这个值可以通过调用countDown 方法让它递减,直到为0

在count为0之前,所有调用await的方法全部挂起。

 

内部实现:依赖于AbstractQueuedSynchronizer 框架,让调用await的方法的线程挂起park,直到countDown 操作,改变count的值,unpark 对应的线程。 

应用场景:

比如一个A服务,需要调用B,C两个服务 并merge他们的结果进行返回

 

1、A服务线程要进入等待状态(await)

2、通过对B,C各启动一个线程去执行,执行完后(调用countDown),唤醒A

 

	public static void main(String[] args) throws Exception {
		final CountDownLatch cdl = new CountDownLatch(1);
		   new Thread("A"){
	        	
	        	public void run() {
	        		try {
	        			System.out.println("Thread A entered");
						cdl.await();
						System.out.println("Thread A over");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
	        	};
	        }.start();
	        
	        
	        new Thread("B"){
	        	
	        	public void run() {
	        		try {
	        			System.out.println("Thread B entered");
						cdl.await();
						System.out.println("Thread B over");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
	        	};
	        }.start();
	        
	        
	        
	         new Thread("C"){
	        	
	        	public void run() {
	        		System.out.println("Thread C entered");
	        		try {
	        			Thread.sleep(1000);
	        		} catch (InterruptedException e) {
	        			e.printStackTrace();
	        		}
					cdl.countDown();
					System.out.println("Thread C over");
	        	};
	        }.start();
	        
	}
	

 

演化场景:

比赛的时候 多个选手,等待号令

选手:多个选手各自await

号令:countDown,注意Count设置为1

特殊:

1、如果countDown被提前调用了,await 被后调用,结果会如何?

private static void testBasic2() throws Exception{
		CountDownLatch cdl = new CountDownLatch(1);
		cdl.countDown();
		cdl.await();
		cdl.await();
		System.out.println("over");
	}

结论:没有影响 

 

2、如果count设置为0,await操作会如何?

private static void testBasic() throws Exception{
		CountDownLatch cdl = new CountDownLatch(0);
		
		System.out.println(cdl.getCount());
		
		cdl.await();
		cdl.await();
		System.out.println("over");
	}

 结论:无法起到线程阻塞的效果

 

 

CyclicBarrier:

效果:当多个线程达到齐(await),执行一个操作(Runnable)

内部实现:

1、通过ReentrantLock  实现锁的功能,通过ReentrantLock.newCondition() 进行协调线程

 

2、通过lock 控制 一个count状态,当一个线程调用CyclicBarrier.await的时候,count 减一,当count=0的时候,执行Runnable.run 方法,并调用signalAll 方法,唤醒其他线程;当count !=0的时候,调用Condition.await 方法,让当前线程挂起。

 

 

CyclicBarrier 和CountDownLatch:

CyclicBarrier:是线程到达齐后,开始执行某一个任务,并且是可以循环的

CountDownLatch:更倾向于 某个或者多个线程触发了某个条件,其他线程(一个/多个)可以继续执行下面的任务。

1
1
分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    ### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

    常见的Java笔试题-JVM-JUC-Core:JUCJVM核心知识点

    CountDownLatch/CyclicBarrier/Semaphore CountDownLatch 枚举类的使用 CyclicBarrier Semaphore 阻塞队列 SynchronousQueue Callable接口 阻塞队列的应用——生产者消费者 传统模式 阻塞队列模式 阻塞队列的应用...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...

    java 模拟快车下载器

    为了协调各个线程,可以使用CountDownLatch或CyclicBarrier等同步工具。线程间需要共享已下载的总字节数,以便在所有线程完成下载后正确合并文件。 具体实现上,每个线程将文件分割成多个部分,计算各自应下载的...

    Java 访问量

    在多线程环境中,可以使用并发工具类CountDownLatch或CyclicBarrier来同步计数。每当有新的请求到来,计数器减一,直到计数器归零,表示所有请求已完成,可以获取总访问量。 6. **异步处理**: 如果需要处理大量...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

    android 线程详解 各种经典 完整代码

    3. Semaphore/CountDownLatch/CyclicBarrier:并发控制工具,用于控制线程的并发数量或者同步多个线程的执行。 4. Handler/Looper:主线程中的Looper循环接收子线程发送的消息,实现线程间通信。 四、...

    用成员变量进行线程通信.rar_线程通信

    4. **CountDownLatch/CyclicBarrier/Semaphore**:这些是Java并发工具类,用于线程间的同步和协调。例如,CountDownLatch允许一个线程等待其他线程完成操作,CyclicBarrier则让一组线程等待所有线程到达屏障点后一起...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...

    Java工程师技能图谱.pdf

    以及线程池Executor、Lock/ReadWriteLock/Condition、Callable/Future、Atomic原子操作、并发包基础、并发编程、BlockingQueue/CopyOnWriteList/ConcurrentHashMap、CountDownLatch/CyclicBarrier/Semaphore并发容器...

    Java synchronized使用案例

    3. **CountDownLatch/CyclicBarrier/Phaser**:这些工具类用于协调多线程间的同步,实现更复杂的并发控制。 五、实际案例 在`Synchronized`压缩包中,可能包含了通过实验来演示`synchronized`关键字使用的一些Java...

    并发售票_多线程_并发_java_源码.zip

    6. **CountDownLatch/CyclicBarrier/Semaphore** 等并发工具类:它们可以用来协调多个线程之间的交互,比如在所有线程准备就绪后才开始售票,或者限制同时购票的线程数量。 理解并掌握以上这些并发控制机制对于开发...

    Android应用源码之讲多线程的操作方式-IT计算机-毕业设计.zip

    3. **CountDownLatch/CyclicBarrier/Semaphore**:线程同步工具类,用于控制线程间的协调执行。 五、异步编程 1. **RxJava/RxAndroid**:响应式编程库,通过Observables和Observers实现数据流的异步处理。 2. **...

    安卓线程 消费者模型

    5. **CountDownLatch/CyclicBarrier/Semaphore**:这些是 Java 的并发工具类,可以帮助协调多个线程间的同步。例如,生产者可以使用 CountDownLatch 让消费者等待直到所有数据准备好,再开始消费。 6. **LiveData ...

Global site tag (gtag.js) - Google Analytics