Rientranza significa che i blocchi vengono acquisiti su un filo per-piuttosto che ogni singola chiamata.
Questa è una definizione fuorviante. È vero (una specie di), ma manca il vero punto.
Reentrancy significa (in generale terminologia CS/IT) che si fa qualcosa, e mentre lo si sta ancora facendo, lo si fa di nuovo. Nel caso di serrature vuol dire fare qualcosa di simile su un singolo thread:
- acquisire un blocco su "foo".
- Fare qualcosa
- Acquisire un blocco su "foo". Si noti che non abbiamo rilasciato il blocco che abbiamo precedentemente acquisito.
- ...
- serratura uscita su "foo"
- ...
- serratura uscita su "foo"
Con una serratura rientrante/meccanismo di bloccaggio, il tentativo di acquisire la stessa il blocco avrà successo e incrementerà un contatore interno appartenente al blocco. Il blocco verrà rilasciato solo quando il supporto corrente della serratura lo ha rilasciato due volte.
Ecco un esempio in Java utilizzando primitive oggetto serrature/monitor ... che sono rientrante:
Object lock = new Object();
...
synchronized (lock) {
...
doSomething(lock, ...)
...
}
public void doSomething(Object lock, ...) {
synchronized (lock) {
...
}
}
L'alternativa è rientrante frenafiletti non rientrante, dove sarebbe un errore per un thread tenti per acquisire un lucchetto che già detiene.
Il vantaggio di utilizzare i blocchi di rientro è che non devi preoccuparti della possibilità di non riuscire a causa dell'acquisizione accidentale di un blocco già in tuo possesso. Lo svantaggio è che non si può presumere che nulla che chiami cambierà lo stato delle variabili che il blocco è progettato per proteggere. Tuttavia, di solito non è un problema.I lucchetti vengono generalmente utilizzati per proteggere dalle modifiche concomitanti dello stato effettuate da altri thread.
Quindi non ho bisogno di prendere in considerazione situazioni di stallo?
Sì.
Un filo non si bloccherà contro se stesso (se il blocco è rientrante). Tuttavia, potresti ottenere un deadlock se ci sono altri thread che potrebbero avere un blocco sull'oggetto che stai cercando di bloccare.
fonte
2013-05-12 04:40:37
Immaginate se entrando un metodo serrature oggetto X, e mentre in tale metodo si chiama il metodo stesso (direttamente o ulteriormente nello stack di chiamate) e il blocco oggetto X di nuovo. Che succede?Aspetti il blocco che hai già in mano, o è consapevole che il thread che lo trattiene è anche il thread che lo chiama di nuovo e gli consente di passare? Si chiama re-entrancy: si entra nello stesso metodo in cui eri già in precedenza. – Patashu
Sì, i blocchi sincronizzati e i blocchi in Java sono rientranti, quindi una volta che thread foo ha una barra di blocco, può tranquillamente chiamare metodi che bloccano anche la barra senza dover prima sbloccarla. – Patashu
È ancora necessario considerare deadlock, può verificarsi un deadlock quando due thread si attendono reciprocamente. – rubixibuc