Есть ли преимущества использования
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 защелка не может быть повторно использована, и, что более важно, вам нужно заранее знать, сколько потоков будет создано (или дождитесь, пока они все будут запущены до создания защелки.)
Итак, в какой ситуации может быть предпочтительна защелка?