2012-01-08 9 views

risposta

7

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.

+0

Perché il downvote? –

Problemi correlati