Есть ли какие-либо преимущества использования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 защелка не может быть повторно использована и, что более важно, вам нужно знать заранее ho w будет создано множество потоков (или до тех пор, пока все они не будут запущены до создания защелки.)
Итак, в какой ситуации предпочтительнее защелка?
Спасибо. Таким образом, мои два примера не были бы эквивалентны, если бы несколько потоков могли ждать на защелке ... если sem.acquire (num_threads); следует sem.релиз (NUM_THREADS) ;? Я думаю, что это сделает их эквивалентными. – finnw 2008-10-08 21:27:37
В некотором смысле, да, до тех пор, пока каждый поток называется приобретением, за которым следует релиз. Строго говоря, нет. С защелкой все потоки могут запускаться одновременно. С помощью семафора они становятся доступными один за другим (что может привести к различному планированию потоков). – 2008-10-08 21:38:46