Параллелизм Java: блокировка обратного отсчета против циклического барьера - PullRequest
149 голосов
/ 12 ноября 2010

Я читал через java.util.concurrent API и обнаружил, что

  • CountDownLatch: вспомогательное средство синхронизации, позволяющее одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках.
  • CyclicBarrier: средство синхронизации, позволяющее всем потокам ожидать друг друга, чтобы достичь общей точки барьера.

Мне оба кажутся равными, но я уверен, что это намного больше.

Например, в CoundownLatch, the countdown value could not be reset, that can happen in the case of CyclicBarrier.

Есть ли какая-то другая разница между ними?
Каковы use cases, где кто-то захочет сбросить значение обратного отсчета?

Ответы [ 14 ]

4 голосов
/ 14 декабря 2011

В случае CyclicBarrier, как только ВСЕ дочерние потоки начинают вызывать барьер .await (), Runnable выполняется в Барьере.Для завершения барьера.авайта в каждом дочернем потоке требуется разное время, и все они заканчиваются в одно и то же время.

3 голосов
/ 14 мая 2016

В CountDownLatch , основные потоки ожидают завершения выполнения других потоков. В CyclicBarrier рабочие потоки ожидают друг друга для завершения своего выполнения.

Вы не можете повторно использовать один и тот же CountDownLatch , когда счетчик достигает нуля и защелка открыта, с другой стороны, CyclicBarrier можно повторно использовать путем сброса барьера, как только барьер сломан.

1 голос
/ 18 октября 2018

CountDownLatch - это обратный отсчет чего-либо; CyclicBarrier обратный отсчет только для потока

предполагается, что имеется 5 рабочих нитей и одна нить грузоотправителя, а когда рабочие производят 100 изделий, грузоотправитель отправит их.

Для CountDownLatch счетчик может быть для рабочих или предметов

Для CyclicBarrier счетчик может только на рабочих

Если рабочий засыпает бесконечно, с CountDownLatch для предметов, Грузоотправитель может отправить; Однако, с CyclicBarrier, Shipper никогда не может называться

0 голосов
/ 06 ноября 2018

@ Кевин Ли и @Jon Я попробовал CyclicBarrier с опциональным Runnable. Похоже, что он запускается в начале и после чаевых CyclicBarrier. Вот код и вывод

статический барьер CyclicBarrier;

    public static void main(String[] args) throws InterruptedException {
        barrier = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                System.out.println("I run in the beginning and after the CyclicBarrier is tipped");
            }
        });

        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);

        System.out.println("Barrier automatically resets.");

        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
    }

выход

I run in the beginning and after the CyclicBarrier is tipped
Let's play.
Let's play.
Let's play.
Barrier automatically resets.
I run in the beginning and after the CyclicBarrier is tipped
Let's play.
Let's play.
Let's play.
...