Я пытался понять блокировки ретентата и семафоры (гнездо реентера блокировки против механизма разблокировки/разблокировки).Двоичный семафор против ReentrantLock
Кажется, что с помощью Семафора вам нужно написать более тщательно протестированное приложение, потому что метод release() не проверяет, действительно ли поток, освобождающий разрешение, удерживает его. Когда я проверил свой тестовый код, я узнал, что это может впоследствии увеличить количество разрешений за пределы начального предела. С другой стороны, если поток не удерживает блокировку реентера, когда он вызывает метод разблокировки, мы получаем исключение IllegalMonitorException.
Итак, было бы правильно сказать, что нет никакой реальной причины иметь двоичный семафор, как все, что может сделать двоичный семафор, также может быть сделано ReentrantLock. Если мы используем двоичные семафоры, нам нужно будет проверить весь стек вызовов метода, чтобы узнать, было ли ранее получено разрешение (также оно было выпущено также, если есть возможность последующего приобретения), которое может блокироваться, если релиз его не запускает и скоро). Кроме того, поскольку реентеративные блокировки также обеспечивают одну блокировку для каждого объекта, не всегда ли лучше предпочитать блокировку реентера в двоичном семафоре?
Я проверил сообщение здесь, в котором говорится о различии между двоичным семафором и мьютексом, но есть ли что-то вроде мьютекса в Java?
Thanks, Chan.
P.S - Я разместил этот вопрос на другом форуме (http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant), и я еще не получил ответа. Я думал, что отправлю его сюда, чтобы посмотреть, что я могу получить.
http://stackoverflow.com/questions/12641933/difference-between-semaphore-and-condition-reentrantlock может помочь –
Это поведение по дизайну и [хорошо документировано] (http://docs.oracle.com/) javase/7/docs/api/java/util/concurrent/Semaphore.html # release% 28% 29): «* Нет требования, чтобы поток, который освобождал разрешение, должен был получить это разрешение, вызвав метод получения(). использование семафора устанавливается с помощью соглашения о программировании в приложении. * ". При использовании ReentrantLocks вы должны обеспечить правильную освобождение блокировки в блоке finally. Это не соблюдается, но также хорошо документировано. – assylias
См. Также: http://stackoverflow.com/questions/7554839/how-and-why-can-a-semaphore-give-out-more-permits-than-it-was-initialized-with – assylias