CountDownLatch vs. Semaphore
¿Hay alguna ventaja de usar
java.util.concurrent.CountdownLatch
en lugar de
java.util.concurrent.Semaphore?
Por lo que sé, los siguientes fragmentos son casi equivalentes:
1. Semáforo
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();
Excepto que en el caso # 2, el pestillo no se puede reutilizar y, lo que es más importante, debe saber de antemano cuántos subprocesos se crearán (o esperar hasta que todos se inicien antes de crear el pestillo).
Entonces, ¿en qué situación sería preferible el cierre?