Я пытался понять Reentrant locks и Семафоры (вложенность Reentrant locks против механизма release/разблокировки).
Кажется, что с помощью Семафора вам нужно написать более тщательно протестированное приложение, потому что метод release() не проверяет, действительно ли поток, освобождающий разрешение, удерживает его. Когда я проверил свой тестовый код, я узнал, что это может впоследствии увеличить количество разрешений за пределы начального предела. С другой стороны, если поток не удерживает блокировку реентера, когда он вызывает метод разблокировки, мы получаем исключение IllegalMonitorException.
Так было бы правильно сказать, что нет реальной причины когда-либо иметь двоичный семафор, как все, что может сделать двоичный семафор, также может быть сделано ReentrantLock. Если мы используем двоичные семафоры, нам нужно будет проверить весь стек вызовов метода, чтобы узнать, было ли ранее получено разрешение (также оно было выпущено также, если есть возможность последующего приобретения), которое может блокироваться, если релиз его не запускает и скоро). Кроме того, поскольку реентеративные блокировки также обеспечивают одну блокировку для каждого объекта, не всегда ли лучше предпочитать блокировку реентера в двоичном семафоре?
Я проверил сообщение здесь, которое говорит о различии между двоичным семафором и мьютексом, но есть ли что-то вроде мьютекса в Java?
Спасибо, Чан.
PS - Я разместил этот вопрос на другом форуме (http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant), и я еще не получил ответа. Я думал, что отправлю его сюда, чтобы посмотреть, что я могу получить.