await()
.Начальное значение счетчика задается параметром конструктора, затем уменьшается на 1 методом
countDown()
. Узнать текущее значение можно с помощью getCount()
. Изменение значения счетчика никак не связано с потоками, его можно вызывать откуда и когда угодно.CyclicBarrier – барьер для потоков, который ломается при достижении критической массы ожидающих. Это тоже класс из Java Concurrency Framework. Поток также встает на ожидание методом
await()
. Ожидающие потоки называются parties, их лимит также устанавливается в конструкторе. Технически, parties барьера и count латча – одно и то же, await барьера – это await+countDown латча. В барьере тоже доступна информация о текущем состоянии барьера (методы
isBroken
, getParties
и getNumberWaiting
).Помимо этого,
CyclicBarrier
дает две дополнительных возможности. Во-первых, в конструктор кроме parties можно передать коллбэк с действием, которое выполнится в момент прорыва барьера. Во-вторых, этот примитив переиспользуется: метод reset()
насильно прорывает текущий барьер и устанавливает новый. Оба этих примитива помогают решить задачу о гарантированных дедлоках. Противоположность латча и барьера – семафор. В нём потоки блокируются при достижении счетчиком нуля.