`

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并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

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

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

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

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

    CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。

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

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

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

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

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

    主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下

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

    主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    leetcode题库-sword_at_offer:Java、Python、算法、Spring等

    leetcode题库 请访问: 欢迎star,fork,pr 剑指offer刷题说明 刷题地址: 需要找到最优解法:参考学习牛客网左程云视频、牛客网算法讨论、《剑指offer》图书,LeetCode等。 直接编辑器敲出代码,或在纸...CyclicBarrier

    Java中的CountDownLatch类最全讲义

    目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项

    Java并发编程学习笔记

    7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...

    Java进阶教程,面试大全,包罗万象

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Java进阶教程,面试大全

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Concurrent包的小例子

    Concurrent下的例子,涵盖了大部分常用类 例如BlockingQueue、CountDownLatch、CyclicBarrier、Exchanger、ExecuteService、lock、timeutil等

    ThreadTest.rar

    java并发,主要用于初学者学习,主要案列,Thread.join,ThreadLocal,Lock接口,LockSupport,Condition接口,ConcurrentHashMap的实现原理与...Fork/Join 框架,CountDownLatch,CyclicBarrier,Semaphore,Exchanger

    multiThread.jpg

    Java多线程技术思维导图,覆盖全面,可用作学习指导和查缺补漏,十分高效。...涵盖线程中断、线程状态、线程间通信,并发容器、ThreadLocal、Synchronized、CountDownLatch、CyclicBarrier等内容。

    CyclicBarrier用法.docx

    与CountDownLatch不同的是,CyclicBarrier可以重复使用,即当所有线程都到达屏障后,屏障会自动重置,可以继续使用。 CyclicBarrier的构造方法如下: java public CyclicBarrier(int parties, Runnable ...

    多线程控制的三大安全类封装

    多线程控制的三大安全类:CountDownLatch、CyclicBarrier、Semaphore,这工具包将其封装,可以让初学者更容易学习以及让开发者更容易调用,不需要自己重新编写核心代码。具体事例在源码中。

Global site tag (gtag.js) - Google Analytics