【问题标题】:Barrier break down example障碍分解示例
【发布时间】:2012-09-04 16:09:52
【问题描述】:

我正在读这本书Java Concurrency in Practice,上面写着,

CyclicBarrier 允许固定数量的参与方在障碍点重复会合,并且在将问题分解为固定数量的独立子问题的并行迭代算法中很有用。

谁能举例说明它如何将一个问题分解为多个独立的子问题?

【问题讨论】:

  • 看看bulk synchronous parallel范式,你需要一个循环障碍。

标签: java multithreading concurrency cyclicbarrier


【解决方案1】:

您必须自己将问题分解为多个独立的子问题。

障碍确保每一方在开始处理第二个子问题之前完成第一个子问题。这样可以确保在第二个子问题开始之前,第一个子问题的所有数据都可用。

CyclicBarrier 专门用于在每个步骤实际上相同的情况下一遍又一遍地需要相同的屏障。例如,当进行任何类型的多线程现实模拟时,可能会发生这种情况,这种模拟是分步完成的。 CyclicBarrier 将确保每个线程在所有线程开始下一步之前完成给定步骤。

【讨论】:

    【解决方案2】:

    CountDownLatchCyclicBarrier 之间还有一个重要区别,那就是:CountDownLatch 上同步的线程无法指示其他线程出现问题,以便其他线程可以选择要么继续你的中止整个合作操作。

    如果出现CycliBarrier,而其中一个线程正在等待await(),则其他线程被中断或超时,则当前线程上将出现BrokenBarrierException,表明其中一个线程出现问题合作的线程。

    BrokenBarrierException 也会出现在其他情况下,您可以在 Javadoc 中的 await() 方法中找到这些情况。

    开箱即用,CountDownLatch 不提供此功能。

    【讨论】:

      【解决方案3】:

      如果您有一个可以分解为独立子问题的算法,
      那么 CyclicBarrier 对您的所有线程在其结束时相遇很有用计算,例如合并它们的结果。

      请注意,Java 7 中引入的Fork/Join 框架使您无需使用 CyclicBarrier 即可执行类似的操作。

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 2020-03-14
        • 2021-07-15
        • 2017-10-01
        相关资源
        最近更新 更多