首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相位和CyclicBarrier的区别

相位和CyclicBarrier的区别
EN

Stack Overflow用户
提问于 2018-03-27 07:30:22
回答 1查看 3.2K关注 0票数 7

我无意中发现了CyclicBarrier和Phaser实用程序在中的区别。

我理解CyclicBarrier允许一组线程等待直到所有线程到达一个特定的点。相位器也这样做,但它支持多个阶段。我也明白,CyclicBarrier可以重用。--我认为这个重用工具使它的功能与Phaser相同。

考虑下列方案:

测试相位:

代码语言:javascript
复制
import java.util.concurrent.Phaser;

public class PhaserTest {

    public static void main(String[] args) {
        Phaser p = new Phaser(3);
        Thread t1 = new Thread(() -> process(p), "T1");
        Thread t2 = new Thread(() -> process(p), "T2");
        Thread t3 = new Thread(() -> process(p), "T3");
        t1.start();
        t2.start();
        t3.start();
    }

    private static void process(Phaser p) {
        try {
            System.out.println("Started Phase 1: "+Thread.currentThread().getName());
            p.arriveAndAwaitAdvance();
            System.out.println("Finished Phase 1: "+Thread.currentThread().getName());
            System.out.println("Started Phase 2: "+Thread.currentThread().getName());
            p.arriveAndAwaitAdvance();
            System.out.println("Finished Phase 2: "+Thread.currentThread().getName());
        } catch(Exception e) {}
    }

}

输出:

代码语言:javascript
复制
Started Phase 1: T1
Started Phase 1: T2
Started Phase 1: T3
Finished Phase 1: T3
Started Phase 2: T3
Finished Phase 1: T1
Finished Phase 1: T2
Started Phase 2: T2
Started Phase 2: T1
Finished Phase 2: T2
Finished Phase 2: T3
Finished Phase 2: T1

测试CyclicBarrier:

代码语言:javascript
复制
import java.util.concurrent.CyclicBarrier;


public class CyclicBarrierTest {
    public static void main(String[] args) {    
        CyclicBarrier cb = new CyclicBarrier(3);
        Thread t1 = new Thread(() -> process(cb), "T1");
        Thread t2 = new Thread(() -> process(cb), "T2");
        Thread t3 = new Thread(() -> process(cb), "T3");
        t1.start();
        t2.start();
        t3.start();
    }

    private static void process(CyclicBarrier cb) {
        try {
            System.out.println("Started Phase 1: "+Thread.currentThread().getName());
            cb.await();
            System.out.println("Finished Phase 1: "+Thread.currentThread().getName());
            System.out.println("Started Phase 2: "+Thread.currentThread().getName());
            cb.await();
            System.out.println("Finished Phase 2: "+Thread.currentThread().getName());
        } catch(Exception e) {}
    }
}

输出:

代码语言:javascript
复制
Started Phase 1: T1
Started Phase 1: T2
Started Phase 1: T3
Finished Phase 1: T3
Started Phase 2: T3
Finished Phase 1: T1
Started Phase 2: T1
Finished Phase 1: T2
Started Phase 2: T2
Finished Phase 2: T2
Finished Phase 2: T3
Finished Phase 2: T1

在PhaserTest和CyclicBarrierTest中,直到所有各方都到达/完成前一阶段,下一阶段才开始。

所以,拥有Phaser有什么好处?

EN

回答 1

Stack Overflow用户

发布于 2018-03-27 08:52:33

相位器来自JSR-166

在将阶段器与现有Java特性进行比较时,我们解释了支持与CyclicBarrier类类似的功能(在Java 5中引入),但是phasers本质上更灵活: java.util.concurrent CyclicBarrier类支持一组线程之间的周期性屏障同步。然而,与相位器不同的是,CyclicBarriers不支持线程的动态添加或删除,也不支持单向同步或分阶段操作。探索其他障碍实现的主要动机之一不仅是增强灵活性,还在于提高屏障同步概念的性能和可伸缩性: 在三个不同的SMP平台上实现阶段器的可移植实现所获得的性能结果表明,除了它们的通用性和安全性属性带来的生产力好处之外,它们还可以提供比现有障碍实现更好的性能。

这里的全部解释:https://www.infoq.com/news/2008/07/phasers

还有一篇将Phaser定义为CyclicBarier+CountdownLatch的比较文章:http://flex4java.blogspot.com/2015/03/why-and-how-to-use-phaser-in-java.html

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49506820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档