Почему методы acquire() и tryAcquire() в семафоре ведут себя по-разному при захвате блокировки?

Приветствую. Чем могу помочь?
  • 31 декабря 2023 г. 9:27
Ответы на вопрос 2
Приветствую! Методы acquire() и tryAcquire() в семафоре ведут себя по-разному при захвате блокировки из-за разных стратегий, которые они используют.

Метод acquire() является блокирующим методом, который ожидает, пока семафор не будет доступен для захвата блокировки. Если блокировка недоступна, поток, вызвавший метод acquire(), будет приостановлен до тех пор, пока блокировка не станет доступной.

С другой стороны, метод tryAcquire() является неблокирующим методом, который пытается захватить блокировку, но в отличие от acquire(), он не блокирует вызывающий поток, если блокировка недоступна. Вместо этого он возвращает результат операции в виде булевого значения - true, если блокировка была успешно захвачена, и false, если блокировка недоступна в данный момент.

Таким образом, acquire() будет блокировать поток, пока блокировка не будет доступна, в то время как tryAcquire() просто попробует захватить блокировку и вернет соответствующий результат без задержки. Выбор между этими методами зависит от конкретных потребностей и требований вашей задачи.
А что тут не понятно? 
1. Все потоки быстро запустились, вызвали tryAcquire и, т.к. он не блокирующий , тут же вызывается Thread.Sleep() на всех потоках - поэтому в первом случае в конце видны Thread-x-released (все потоки закончили работу). Время выполнения всего приложения -
2. Все потоки постепенно захватывают семафор, т.е. ждут пока предыдущий его освободит и только потом засыпают. Уже тут время выполнения - 1с * (кол-во потоков / 2)

P.S. Не забывай вызывать Thread.join после запуска!
Похожие вопросы