CountDownLatch vs. Semaphore

Ist dort jeder möglicher Vorteil der Verwendung von

java.util.gleichzeitige.CountdownLatch

statt

java.util.gleichzeitige.Semaphor?

Soweit ich sagen kann, die folgenden Fragmente sind fast äquivalent:

1. Semaphore

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

Außer, dass im Fall #2 die Verriegelung kann nicht wiederverwendet werden und noch wichtiger: Sie müssen im Voraus wissen, wie viele threads erstellt werden (oder warten Sie, bis Sie alle Schritte vor der Erstellung der Klinke.)

So, in welcher situation könnten die Riegel vorzuziehen?

InformationsquelleAutor finnw | 2008-10-08
Schreibe einen Kommentar