Synchronizers

CountDownLatch

Приостанавливают выполнение до тех пор, пока не выполнится терминальная точка какая-та. Работает как ворота, пока ворота закрыты, не один поток не может войти, когда ворота открываются, все потоки могут войти.

Обычно используются, для того, чтоб предотвратить выполнение некоторых операций, пока какая-та активность не выполнена.

Примеры
  • Быть уверенным в том, что выполнение не началось до того, как ресурс не активизировался. Т.к выполнение требует активизированного ресура.
  •  Быть уверенным, что сервис не стартанул, пока другие сервисы, которые от него зависят не стартанули.
  •  Ждем, когда все игроки в многопользовательской игре стали готовы, чтоб начать игру.


CountDownLatch - пример такого синхронизатора, когда латч имеет некий счетчик, который иницизилиться при создании. Далее это счетчик уменьшается, и до тех пор, пока не станет 0, все потоки будут заблокированы.

CyclicBarrier

аналогично Latches, но не одноразовый

Semaphore

Указывают количество объектов, которые могут обращаться к ресурсу. Используются например в конектион пулах и т.п

Два основных метода -
  • acquire() - пытается "получить доступ", блокируется в противном случае.
  • acquire(int permits) - может пататься взять сразу несколько permit

release - уменьшает счетчик пермитов, отпускает как бы его.

Может быть как fair, так и non-fair. Если fair, потоки, которые пытаются получить ресурс встают в FIFO

Можно использовать так называемым бинарный семафор, это когда семафор создается с 1 пермитов. И он ведет себя также как Lock, за исключением того, что вызвать release может другой поток, не тот, который вызвал acquire и что-то там начал делать

Комментариев нет:

Отправить комментарий