cyclicbarrier

JAVA 并发体系概览

安稳与你 提交于 2020-04-10 17:40:26
Java并发包主要有以下部分构成: 同步对象 主要提供多个线程以何种方式进行通信协作 执行器 管理多线程,提供线程运行入口 锁 控制线程访问资源的顺序 原子操作 对Java的基本类型进行了封装,对integer等这些包装类提供了原子操作 并发框架 为了简化并行编程的复杂性,Java或者其他公司定义的并发框架 以上对相关的类有一个大致的概览,下面主要大概的讲述一下同步对象的使用场景 Semaphore : 信号量:信号量通过计数器控制对共享资源的访问。如果计数器大于0,访问允许,如果为0,访问是拒绝的。计数器计数允许访问共享资源的许可证,因此,为了访问资源,线程必须获取信号量的访问许可。通常,为了使用信号量,希望访问共享资源的线程尝试取得许可。如果信号量的计数器大于0,就表明线程取得了许可证,这会导致信号量的计数减小;否则线程会被阻塞,直到能够获取许可证为止。当线程不需要访问共享资源时,释放许可证,从而增大信号量的计数。如果还有另外的一个线程正在等待许可证,该线程将在这一刻取得许可证 CountDownLatch : 有时候希望线程进行等待,直到发生一个或多个事件为止。为了处理这类情况,并发API提供了CountDownLatch类。CountDownLatch在初始创建时带有时间数量计数器,在释放锁存器之前,必须发生指定数量的时间。每次发生一个事件时,计数器递减。当计数器达到0时

Java CyclicBarrier介绍

喜你入骨 提交于 2020-04-10 17:40:05
CyclicBarrier (周期障碍)类可以帮助同步,它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier 是使用整型变量构造的,其确定组中的线程数。当一个线程到达屏障时(通过调用 CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。与CountDownLatch不同的是,CyclicBarrier 所有公共线程都到达后,可以继续执行下一个目标点,而CountDownLatch第一次到达指定点后,也就是记数器减制零,就无法再次执行下一目标工作。下面主要演义CyclicBarrier 的用法: package com.test; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestCyclicBarrier { private static int[]

CyclicBarrier处理控制多线程顺序

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-10 16:51:48
一直苦于无法控制多线程的处理顺序,最近看到java提供了很好的工具,所以抓过来学习下。但是看了一通注释还有网上的一堆解释,看的头晕。还是写一个测试代码来理解好了。 示例代码实现了,多个线程处理list加总和的问题。 主要有两点需要注意: 1,通过CyclicBarrier来控制多线程处理流程 2,通过synchronized来同步汇总总和 package com.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 模拟多个线程来处理list的数据加和,并最后打出结果 * @author owen.huang * */ class SumList implements Runnable{ private List<Integer> subList; private CyclicBarrier barrier; private Integer subSum = 0; public static Long allSum = 0l; private static Object obj = new Object();

Java并发编程中级篇(四):使用CyclicBarrier实现并发线程在集合点同步

夙愿已清 提交于 2020-04-10 16:33:19
上一节讲到了CountDownLatch这个并发辅助类,它能够让一个线程等待其他并发线程执行完一组任务后再继续执行,也可以说是实现了并发线程在集合点同步。但是Java又给出了一个更强大的并发辅助类CyclicBarrier。 CyclicBarrier也使用一个整形参数进行初始化,这个参数是需要再某点同步的线程数。当线程调用await()方法后CyclicBarrier类将把这个线程编为WAITING状态,并等待直到其他线程都到达集合点。当最后一个线程到达集合点后,调用CyclicBarrier类的await()方法时,CyclicBarrieer对象将唤醒所有通过await()方法进入等待的线程。 CyclicBarrier与CountDownLatch不同的地方在于,CountDownLatch通过countDown()方法对计数器减1来标记一个线程已经到达集合点,并且这个线程不会阻塞会继续执行。而CyclicBarrier类则通过await()方法标记线程到达集合点,并且这个到达集合点的线程会被阻塞。另外CyclicBarrier还支持把一个Runnable对象作为一个初始化参数,当所有的线程都到达集合点的时候,这个线程会被启动。这非常类似以一个分治算法的实现,把一个大任务拆分成若干个子任务,并等待所有子任务结束后,输出执行结果。

When to reset CyclicBarrier in java multithreading

半腔热情 提交于 2020-03-13 06:05:30
问题 I was reading CyclicBarrier in the following link http://java-latte.blogspot.in/2013/10/cyclicbarrier-in-java-concurrency.html. In the example 1, CyclicRaceDemo.java main method, CyclicBarrier is being reused without calling reset method. I ran the example and it worked fine. So, I am wondering what's the use of reset method. When should it be called? Or do we need to call it at all? 回答1: A CyclicBarrier is cyclic because it can be reused without resetting. From the Javadoc A synchronization

Is my code thread-unsafe?

梦想的初衷 提交于 2020-02-01 14:23:12
问题 I have wrote code to understand CyclicBarrier. My application emulates election. Each rounds selects candidate with small votes and this candidate eliminates from the race for victory. source: class ElectoralCommission { public volatile boolean hasWinner; public volatile String winner; private List<String> candidates; private Map<String, Integer> results = new ConcurrentHashMap<>(); ElectoralCommission(List<String> candidates) { this.candidates = candidates; } public void acceptVote(int index

java障碍器 CyclicBarrier

五迷三道 提交于 2020-01-07 15:39:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。 障碍器是多线程并发控制的一种手段 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。 CountDownLatch介绍: http://my.oschina.net/jielucky/blog/157946 Java线程:新特征-障碍器 -主线程 package com.thread.cyclicBarrier; /** * Java线程:新特征-障碍器 -主线程 * @author wangjie * */ public class MainTask

Implementing a cyclicbarrier in java using semaphores

走远了吗. 提交于 2019-12-25 02:50:28
问题 The question is as follows, since the barrier is only called using down() so that it would wait for the n threads to arrive and then execute all n threads together in the critical region now how do I inform the threads calling on barrier.down that it can move on now. I tried adding notifyAll() after phase2() and that doesn't work. Help? :) public class cyclicBarrier { private int n; private int count; private semaphore mutex; private semaphore turnstile; private semaphore turnstile2; public

CountDownLatch和CyclicBarrier

試著忘記壹切 提交于 2019-12-24 19:57:41
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、多线程开发中,经常会遇到一个线程等待一个或多个线程的情况,遇到这样的场景如何解决? 一个线程等待一个线程:可以通过wait和notify实现 一个线程等待多个线程:可以通过CountDownLatch实现 多个线程之间互相等待:可以通过CyclicBarrier实现 2、countDownLatch和CyclicBarrier的区别: countDownLatch 减计数方式 调用countDown()计数减1,调用await()只阻塞线程,对计数无影响 计数为0时,释放所有等待的线程 计数为0时,不可重复利用 CyclicBarrier 加计数方式 调用await方法,计数加1,若加1后的值不等于构造方法的值,则线程阻塞 计数达到指定值时,计数重新置为0,释放所有阻塞线程 计数达到指定值时,可重复利用. 3、CountDownLatch的伪代码如下所示: //Main thread start //Create CountDownLatch for N threads //Create and start N threads //Main thread wait on latch //N threads completes there tasks are returns //Main thread

用ExecutorService&cyclicBarrier&countDownLatch实现...

三世轮回 提交于 2019-12-06 15:35:43
这个博客介绍的不错: http://my.oschina.net/jielucky/blog/157946 http://my.oschina.net/adwangxiao/blog/110188 我再顺着这个博客往下写: 赛马是个不错的多线程场景,包括所有赛马都准备好,然后指挥官喊预备跑部分,然后所有赛马跑到了,关闭所有跑道两部分,这个场景可以很好的运用多线程。如下图所示. package com.xue.gang.barrier; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CyclicBarrierMutiRunner { public static void main(String args[]) throws InterruptedException{ final int size = 10; ExecutorService