Ho cercato di capire le serrature e i semafori del rientro (il nidificazione delle serrature reentrate rispetto al meccanismo di sblocco/sblocco).Semaforo binario rispetto a ReentrantLock
Sembra che avere un semaforo richieda di scrivere un'applicazione più accuratamente testata perché il metodo release() non controlla se il thread che rilascia il permesso lo trattiene effettivamente. Quando ho testato il mio codice di test, ho scoperto che questo potrebbe successivamente aumentare il numero di permessi oltre il limite iniziale. D'altra parte, se un thread non è in possesso di un blocco rientro quando invoca il metodo di sblocco, otteniamo un IllegalMonitorException.
Quindi sarebbe giusto dire che non esiste una vera ragione per avere un semaforo binario come tutto ciò che un semaforo binario può fare anche da un ReentrantLock. Se usiamo semafori binari dovremmo controllare l'intero stack di chiamate del metodo per vedere se un permesso è stato acquisito prima (anche se è stato rilasciato anche se c'è la possibilità di un successivo acquisto - che potrebbe bloccare se un rilascio non lo procede e presto). Inoltre, poiché i blocchi rientranti forniscono anche un blocco per oggetto, non è sempre meglio preferire un blocco di rientro a un semaforo binario?
Ho controllato qui un post che parla della differenza tra un semaforo binario e un mutex ma c'è qualcosa come un mutex in Java?
Grazie, Chan.
P.S - Avevo postato questa domanda in un altro forum (http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant) e non ho ancora ricevuto una risposta. Ho pensato di pubblicarlo anche qui per vedere cosa posso ottenere.
http://stackoverflow.com/questions/12641933/difference-between-semaphore-and-condition-reentrantlock può aiutare –
Questo comportamento è di progettazione e [ben documentato] (http://docs.oracle.com/ JavaSE/7/docs/api/java/util/concorrente/Semaphore.html # rilascio% 28% 29): "* non è richiesto che un thread che rilascia un permesso deve aver acquisito tale permesso chiamando acquire() corretto. l'uso di un semaforo è stabilito dalla convenzione di programmazione nell'applicazione. * ". Quando si utilizza ReentrantLocks, è necessario assicurarsi di rilasciare correttamente il blocco in un blocco finale. Anche questo non è applicato, ma è ben documentato. – assylias
Consulta anche: http://stackoverflow.com/questions/7554839/how-and-why-can-a-semaphore-give-out-more-permits-than-it-was-initialized-with – assylias