CountDownLatch по сравнению с семафором

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

89
задан finnw 18 August 2016 в 12:46
поделиться

4 ответа

Фиксатор Countdown часто используется для полной противоположности Вашего примера. Обычно у Вас было бы много потоков, блокирующихся на, "ждут ()", который был бы все запускаться одновременно, когда countown достиг нуля.

final CountDownLatch countdown = new CountDownLatch(1);
for (int i = 0; i < 10; ++ i){
   Thread racecar = new Thread() {    
      public void run()    {
         countdown.await(); //all threads waiting
         System.out.println("Vroom!");
      }
   };
   racecar.start();
}
System.out.println("Go");
countdown.countDown();   //all threads start now!

Вы могли также использовать это в качестве MPI-стиля "барьер", который заставляет все потоки ожидать других потоков для наверстывания до определенного момента перед продолжением.

final CountDownLatch countdown = new CountDownLatch(num_thread);
for (int i = 0; i < num_thread; ++ i){
   Thread t= new Thread() {    
      public void run()    {
         doSomething();
         countdown.countDown();
         System.out.printf("Waiting on %d other threads.",countdown.getCount());
         countdown.await();     //waits until everyone reaches this point
         finish();
      }
   };
   t.start();
}

, Который все сказали, фиксатор Countdown может безопасно использоваться таким образом, Вы показали в своем примере.

105
ответ дан James Schek 24 November 2019 в 07:15
поделиться

CountDownLatch используется, чтобы запустить серию потоков и затем ожидать, пока все они не завершены (или пока они не звонят countDown() данное количество раз.

Семафор используется для управления количеством параллельных потоков, которые используют ресурс. Тот ресурс может быть чем-то как файл или мог быть CPU путем ограничения количества выполнения потоков. Количество на Семафоре может пойти вверх и вниз, как различные потоки звонят acquire() и release().

В Вашем примере, Вы по существу используете Семафор в качестве своего рода количества Фиксатор. Учитывая, что Ваше намерение состоит в том, чтобы ожидать на всем окончании потоков, использование эти CountdownLatch делает Ваше намерение более ясным.

64
ответ дан Ravindra babu 24 November 2019 в 07:15
поделиться

Рассмотрение источника в свободном доступе, нет никакого волшебства в реализации этих двух классов, таким образом, их производительность должна быть почти такой же. Выберите тот, который делает Ваше намерение более очевидным.

1
ответ дан flup 24 November 2019 в 07:15
поделиться

CountdownLatch заставляет потоки ожидать на ждании () метод до такого времени, как количество достигло нуля. Таким образом, возможно, Вы хотите, чтобы все Ваши потоки ожидали до 3 вызовов чего-то, тогда все потоки могут пойти. Фиксатор обычно не может сбрасываться.

Семафор А позволяет потокам получать разрешения, который препятствует тому, чтобы слишком много потоков выполнились сразу, блокируясь, если это не может получить разрешение (разрешения), это требует для продолжения. Разрешения могут быть возвращены к Семафору, позволяющему другие потоки ожидания продолжаться.

0
ответ дан Spencer Kormos 24 November 2019 в 07:15
поделиться