Теперь, поскольку у меня есть 2 доступных разрешения, два потока могут получить блокировку, которая отвергает цель аргумента.
Он не побеждает цель Semaphore
.Цель Semaphore
состоит в том, чтобы реализовать счетную семафорную абстракцию, как описано здесь .
Почему Semaphore
не учитывает предоставленный аргумент?
Это действительно чтит это.Но аргумент не ограничивает количество разрешений.Скорее он представляет количество разрешений, которые первоначально могут быть получены без блокировки.
Почему он так себя ведет?
Потому что (по мнению разработчиков Java) именно так должен вести себя счетный семафор .
Стандартный класс Semaphore
не имеет способа ограничить количество разрешений.Если вы хотите блокировку (или двоичный семафор), вы должны использовать Lock
класс ...
Но в многопоточном приложении возможно, что освобождение и получение не синхронизируютсяи он заканчивает тем, что вызвал выпуск дважды.
Да.Это было бы ошибкой в приложении.
Теперь ... если вы хотите это обнаружить, вы можете расширить класс Semaphore
и переопределить методы acquire
и release
, чтобы проверить, что числоразрешений остается между установленными границами.(Вы можете выдать непроверенное исключение, если проверка не удалась. Или вы можете молча проигнорировать запрос ... хотя это звучит как плохая идея.)