CyclicBarrier и CountDownLatch?

В чем разница между CyclicBarrier и CountDownLatch? У меня есть небольшая разница, так как оба выглядят одинаково.

Пожалуйста, дайте мне знать, если я ошибаюсь, и объясните то же самое.

1 ответ

Решение

CountDownLatch используется для одноразовой синхронизации. При использовании CountDownLatch любой поток может вызывать countDown() сколько угодно раз. Потоки, вызвавшие await(), блокируются до тех пор, пока счетчик не достигнет нуля из-за вызовов countDown() другими разблокированными потоками. Javadoc для CountDownLatch заявляет:

Методы await блокируются до тех пор, пока текущий счетчик не достигнет нуля из-за вызовов метода countDown(), после чего все ожидающие потоки освобождаются и любые последующие вызовы await немедленно возвращаются....

Другое типичное использование - разделить проблему на N частей, описать каждую часть с помощью Runnable, который выполняет эту часть и выполняет обратный отсчет в защелке, и поставить все Runnables в очередь для исполнителя. Когда все части будут завершены, координирующий поток сможет пройти через await. (Когда потоки должны повторно вести обратный отсчет таким образом, вместо этого используйте CyclicBarrier.)

Напротив, циклический барьер используется для нескольких точек синхронизации, например, если набор потоков выполняет циклическое / поэтапное вычисление и нуждается в синхронизации перед началом следующей итерации / фазы. Согласно Javadoc для CyclicBarrier:

Барьер называется циклическим, потому что его можно использовать повторно после освобождения ожидающих потоков.

В отличие от CountDownLatch, каждый вызов await() относится к какой-либо фазе и может привести к блокировке потока до тех пор, пока все стороны, принадлежащие этой фазе, не вызовут await(). Нет явной операции countDown(), поддерживаемой CyclicBarrier.

Другие вопросы по тегам