搜索
写经验 领红包

java中同步方法(java中的同步)

导语:Java并发编程之同步计数器CyclicBarrier

java中同步方法(java中的同步)

CyclicBarrier是一个同步辅助类,翻译过来叫循环栅栏、循环屏障。它允许一组线程互相等待,知道到达某个公共屏障点(common barrier point),然后所有的这组线程在同步往后面执行。在涉及一组固定大小的线程的程序中,这些线程必须不时的互相等待,此时CyclicBarrier很有用。不要错误的理解,不时线程屏障可以重复使用,而是多个线程都想多个循环一样,都循环到这个点了,再一起开始往后面执行。

主要的方法有:

(1)CyslicBarrier(int parties),创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动barrier时执行定义的操作。

(2)CyclicBarrier(int parties,Runnable barrierAction),创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动barrier时执行给定的屏障操作,该操作由最后一个进入Barrier的线程执行。

(3)int await(),在所有参与者都已经在此barrier上调用await方法之前,将一直等待。

(4)int await(long timeout,TimeUnit unit),在所有参与者都已经在此屏障上调用await方法之前将一直等待,或者超出了指定的等待的时间。

(5)int getNumberWaiting(),返回当前在屏障处等待的参与者数目。

(6)int getParties(),返回要求启动此barrier的参与者数目

(7)boolean isBroken(),查询此屏障是否处于损坏状态。

(8)void reset(),将屏障重置为其初始状态。

使用场景:

大数据运算需要拆分成多步骤的时候。比如这么一个实际应用场景:我们需要统计全国的业务数据,其中各省的数据库是独立的,也就是说按省份分库,并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算,我们采用并发的方式,多个线程同时计算各省数据,每个省下面又用多线程,最后在汇总统计。

实例:

运行结果如下:

从运行结果上面仔细体会与CountDownLatch的区别。

CountDwonLatch:一个线程(或者多个),等待另外N个线程完成某个事情之后才能执行

CyclicBarrier:N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。

这样比对一下应该就清楚了,对于CountDownLatch来说,重点是那个“一个线程”,是他在等待,而另外那N个线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。

本文内容由小故整理编辑!