CountDownLatch против семафора

Есть ли преимущество использования

java.util.concurrent.CountdownLatch

вместо

java.util.concurrent.Semaphore?

Насколько я могу судить, следующие фрагменты почти эквивалентны:

1. Семафор

final Semaphore sem = new Semaphore(0);
for (int i = 0; i < num_threads; ++ i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        sem.release();
      }
    }
  };
  t.start();
}

sem.acquire(num_threads);

2: CountDownLatch

final CountDownLatch latch = new CountDownLatch(num_threads);
for (int i = 0; i < num_threads; ++ i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        latch.countDown();
      }
    }
  };
  t.start();
}

latch.await();

За исключением того, что в случае № 2 защелка не может быть повторно использована, и, что более важно, вам нужно заранее знать, сколько потоков будет создано (или подождать, пока все они будут запущены, прежде чем создавать защелку).

Так в какой ситуации защелка может быть предпочтительнее?

Ответы на вопрос(6)

Ваш ответ на вопрос