CountDownLatch vs Sémaphore

Est-il un avantage de l'utilisation de

java.util.de façon concomitante.CountdownLatch

au lieu de

java.util.de façon concomitante.Sémaphore?

Autant que je peux dire fragments sont presque équivalents:

1. Sémaphore

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();

Sauf que dans le cas n ° 2 le verrou ne peut pas être réutilisé et plus important encore, vous avez besoin de savoir à l'avance combien de threads sera créé (ou attendre jusqu'à ce qu'ils sont tout a commencé avant la création de l'loquet.)

Donc dans quelle situation pourrait le loquet être préférable?

InformationsquelleAutor finnw | 2008-10-08