Próbowałem zrozumieć Reentrant locks i Semaphores (zagnieżdżanie Reentrant locks vs release/unlock mechanism).Binary Semaphore vs ReentrantLock
Wydaje się, że posiadanie semafora wymaga napisania dokładniej przetestowanej aplikacji, ponieważ metoda release() nie sprawdza, czy wątek zwalniający zezwolenie faktycznie go zatrzymuje. Kiedy przetestowałem mój kod testowy, okazało się, że może to następnie zwiększyć liczbę zezwoleń poza początkowy limit. Z drugiej strony, jeśli wątek nie ma blokady ponownego wejścia, gdy wywołuje metodę odblokowania, otrzymujemy wyjątek IllegalMonitorException.
Więc byłoby słuszne stwierdzenie, że nie ma prawdziwego powodu, aby kiedykolwiek mieć binarny semafor, ponieważ wszystko, co może zrobić binarny semafor, może być również wykonane przez ReentrantLock. Gdybyśmy używali semaforów binarnych, musielibyśmy sprawdzić cały stos wywołań metod, aby sprawdzić, czy wcześniej uzyskano zezwolenie (również zostało ono wydane, jeśli istnieje możliwość późniejszego przejęcia - które może zablokować, jeśli zwolnienie nie spowoduje jego wykonania i wkrótce). Również skoro zamki reentrantowe zapewniają również jeden zamek na obiekt, czy nie lepiej jest preferować blokadę reentrantu do semafora binarnego?
Sprawdziłem post tutaj, który mówi o różnicy między binarnym semaforem a muteksem, ale czy istnieje coś takiego jak muteks w Javie?
Dzięki, Chan.
P.S - Wysłałem to pytanie na innym forum (http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant) i nie otrzymałem jeszcze odpowiedzi. Pomyślałem, że też zamieściłem to tutaj, żeby zobaczyć, co mogę dostać.
http://stackoverflow.com/questions/12641933/difference-between-semaphore-and-condition-reentrantlock może pomóc –
To zachowanie jest zgodne z projektem i [dobrze udokumentowane] (http://docs.oracle.com/ javase/7/docs/api/java/util/concurrent/Semaphore.html # release% 28% 29): "* Nie ma wymogu, aby wątek zwalniający zezwolenie musiał uzyskać to zezwolenie, wywołując metodę acquire(). użycie semafora jest ustalane przez programowanie konwencji w aplikacji. * ". Podczas korzystania z ReentrantLocks, musisz upewnić się, że poprawnie zwolniłeś blokadę w bloku finally. To też nie jest egzekwowane, ale jest również dobrze udokumentowane. – assylias
Zobacz też: http://stackoverflow.com/questions/7554839/how-and-why-can-a-semaphore-give-out-more-permits-than-it-was-initialized-with – assylias