mi chiedo c'è grande differenza nell'uso ReentrantLock
e synchronized (object)
.
Le principali differenze sono:
Con synchronized
il bloccaggio/sbloccaggio è legata alla struttura a blocchi del codice sorgente. Un blocco synchronized
verrà rilasciato quando si esce dal blocco, indipendentemente da come lo si fa. Ad esempio, verrà rilasciato se il blocco termina a causa di un'eccezione imprevista.
Con blocco esplicito questo non è il caso, quindi è possibile acquisire uno ReentrantLock
(o qualsiasi altro Lock
) in un metodo e rilasciarlo in un altro. Ma il rovescio della medaglia è che tu devi ricordare di rilasciare esplicitamente il Lock
al momento/luogo appropriato. Se non lo fai finirai con un blocco bloccato e (forse) deadlock. In breve, ReentrantLock
è più complicato e potenzialmente più soggetto a errori.
Il blocco primitivo che si ottiene con synchronized
funziona con Object.wait()
e Object.notify()
. Lock
no.
A ReentrantLock
può essere creato per essere "equo", il che significa che i thread che sono in attesa di acquisire un dato blocco acquisiranno il blocco in quindici ordini. Le serrature primitive non sono giuste.
L'API ReentrantLock
ha metodi che è possibile utilizzare per verificare se il blocco è in uso, rilevare la lunghezza della coda di blocco, provare ad acquisire il blocco senza bloccare e varie altre cose. Nessuna di queste funzionalità è disponibile per i blocchi primitivi.
perché si chiama un blocco rientrante? consentire la chiamata ricorsiva dallo stesso thread?
Un blocco di rientro consente a un thread in possesso di un lucchetto di acquisirlo di nuovo. Uno dei modi in cui ciò potrebbe accadere è attraverso la ricorsione, ma ce ne sono anche altri.
Per il record, i blocchi synchronized
sono rientranti, quindi non è necessario preoccuparsi della ricorsione, o di altri scenari in cui un thread potrebbe acquisire un blocco che già detiene.
fonte
2012-01-08 00:29:27
@skaffman - Questa domanda non copre l'argomento "rientranza". –