非常有用的并发控制-循环栅栏CyclicBarrier

简介: 昨天我讲了倒计时器CountDownLatch的应用,它是阻塞线程直到计时器归0的一种等待方式。今天讲的这个循环栅栏CyclicBarrier与倒计时器非常类似,但它比倒时器更加强大且稍微复杂,它也是并发控制中非常实用的工具。

昨天我讲了倒计时器CountDownLatch的应用,它是阻塞线程直到计时器归0的一种等待方式。今天讲的这个循环栅栏CyclicBarrier与倒计时器非常类似,但它比倒时器更加强大且稍微复杂,它也是并发控制中非常实用的工具。

循环栅栏CyclicBarrier,从英语字义可以理解为它是可以循环利用的,且栅栏是用来阻止线程在栅栏外等待的,它同样是阻止线程等待,它和CountDownLatch倒底有什么区别呢?

给你出道题,5个线程同时执行,当每个线程都执行了某段代码后再继续往下执行,如果5个线程未到齐,否则其他线程一直等待。

从上面的题目,我们来看下面的例子,理解什么是循环栅栏。

首先CyclicBarrier构造方法接受5个线程数和线程聚齐时的回调线程。什么意思呢?就是当5个线程都调用了await()方法,这5个线程才继续往下执行,执行前先运行到齐时的回调线程。

从例子输出的结果可以看出cb finish先运行的,说明到齐运行了回调线程,再输出了每个线程的耗时,我们控制10个线程来阻塞等待,而循环栅栏只有5个,说明它是可以循环利用的,每到齐5个线程阻塞的线程就继续执行。

需要注意的await方法会抛出异常,一个是中断异常InterruptedException,即是其他线程中断了这个线程,另外一个是BrokenBarrierException,如果1个线程被打断出现InterruptedException,其他等待在循环栅栏外面的线程就会出现BrokenBarrierException。因为一个线程被打断了,即打破了循环栅栏的完整性,导致线程不能到齐其他线程永远不能继续执行,这个异常也就避免了线程永远等待的情况。

希望对你有用,有什么问题也欢迎到下面留言,文章所示代码请加下面的QQ群文件下载。

相关文章
|
5月前
CyclicBarrier(栅栏)实现高并发测试
CyclicBarrier(栅栏)实现高并发测试
|
3月前
|
缓存 算法 Java
多线程04 死锁,线程可见性
多线程04 死锁,线程可见性
22 0
|
7月前
|
Java 开发工具 git
【Java多线程】如何正确使用循环栅栏CyclicBarrier
想象一个这样的场景,我们在打王者荣耀/英雄联盟的时候,都会有一个匹配机制,需要10个人都加载完成后,大家才能一起进入游戏,不然会出现大家进入游戏的时间不一致的情况,这个时候就可以使用CyclicBarrier来实现。
|
11月前
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
42 0
深入理解JUC:第五章:CyclicBarrier循环栅栏
深入理解JUC:第五章:CyclicBarrier循环栅栏
深入理解JUC:第五章:CyclicBarrier循环栅栏
|
Java
【Java多线程】写一个死锁的例子
【Java多线程】写一个死锁的例子
85 0
|
Java API
【JUC】循环屏障CyclicBarrier详解
【JUC】循环屏障CyclicBarrier详解
99 0
【JUC】循环屏障CyclicBarrier详解
|
关系型数据库 MySQL Java
【Semaphore、ReentrantLock、CountDownLatch、Cyclicbarrier、ReadWriteLock】多线程交替执行、顺序执行、同时执行、读写分离执行、生产者消费者
【Semaphore、ReentrantLock、CountDownLatch、Cyclicbarrier、ReadWriteLock】多线程交替执行、顺序执行、同时执行、读写分离执行、生产者消费者
87 0
【Semaphore、ReentrantLock、CountDownLatch、Cyclicbarrier、ReadWriteLock】多线程交替执行、顺序执行、同时执行、读写分离执行、生产者消费者
使用递增计数器的线程同步工具 —— 信号量,它的原理是什么样子的?
在 JUC 中线程同步器除了 CountDownLatch 和 CycleBarrier ,还有一个叫做 Semaphore (信号量),同样是基于 AQS 实现的。下面来看看信号量的内部原理。
107 0
CyclicBarrier循环栅栏
CyclicBarrier循环栅栏和CountDownLatch 很类似 ,都能阻塞一组线程 - 当有大量线程相互配合,分别计算不同任务,并且需要最后统一汇总的时候,我们可以使用CyclicBarrier 。CyclicBarrier可以构造一个集结点,当某一个线程执行完毕,他就会到集结点等待,知道所有线程都到了集结点,那么该栅栏就被撤销,所以有线程在统一出发,继续执行剩下都任务。
224 0
CyclicBarrier循环栅栏

相关实验场景

更多