CountDownLatch
Приостанавливают выполнение до тех пор, пока не выполнится терминальная точка какая-та. Работает как ворота, пока ворота закрыты, не один поток не может войти, когда ворота открываются, все потоки могут войти.Обычно используются, для того, чтоб предотвратить выполнение некоторых операций, пока какая-та активность не выполнена.
Примеры
- Быть уверенным в том, что выполнение не началось до того, как ресурс не активизировался. Т.к выполнение требует активизированного ресура.
- Быть уверенным, что сервис не стартанул, пока другие сервисы, которые от него зависят не стартанули.
- Ждем, когда все игроки в многопользовательской игре стали готовы, чтоб начать игру.
CountDownLatch - пример такого синхронизатора, когда латч имеет некий счетчик, который иницизилиться при создании. Далее это счетчик уменьшается, и до тех пор, пока не станет 0, все потоки будут заблокированы.
CyclicBarrier
аналогично Latches, но не одноразовыйSemaphore
Указывают количество объектов, которые могут обращаться к ресурсу. Используются например в конектион пулах и т.пДва основных метода -
- acquire() - пытается "получить доступ", блокируется в противном случае.
- acquire(int permits) - может пататься взять сразу несколько permit
release - уменьшает счетчик пермитов, отпускает как бы его.
Может быть как fair, так и non-fair. Если fair, потоки, которые пытаются получить ресурс встают в FIFO
Можно использовать так называемым бинарный семафор, это когда семафор создается с 1 пермитов. И он ведет себя также как Lock, за исключением того, что вызвать release может другой поток, не тот, который вызвал acquire и что-то там начал делать
Комментариев нет:
Отправить комментарий