Domanda

Quando preferire l'oggetto di blocco privato per sincronizzare un blocco su blocco intrinseco (questo)? Si prega di citare i tiri di entrambi.

Oggetto di blocco privato:-

Object lock =new Object();  
synchronized(lock)
{  }

Lock intrinseco (questo):-

synchronized(this)
{  }
È stato utile?

Soluzione

Usando esplicito lock Gli oggetti possono consentire metodi diversi da sincronizzare su blocchi diversi ed evitare contese inutili. Inoltre, rende il blocco più esplicito e può semplificare la ricerca del codice per blocchi che utilizzano il blocco.

Probabilmente non vuoi nemmeno farlo, comunque! Trova la classe appropriata in Java.util.ConCurrent e usa invece. :)

Altri suggerimenti

Un blocco privato può essere utile se stai facendo una sorta di sharding di blocco, cioè, è necessario bloccare solo alcune parti del tuo oggetto mentre ad altri è ancora possibile accedere da un cliente diverso.

Un semplice parallelo per capire questo concetto è un blocco della tabella in un database: se si modifica una tabella, si acquisisce il blocco su quella singola tabella, non l'intero database, quindi il resto delle tabelle può essere modificato da altri client. Se hai bisogno di implementare una logica simile ma in un pojo useresti quante serrature private necessarie.

Un aspetto negativo di questo approccio è che la tua classe viene ingombra con molti oggetti. Ciò potrebbe indicare che devi refactorlo in un insieme più granulare di classi con una strategia di bloccaggio più semplice, ma tutto dipende dalla progettazione e dall'implementazione.

Questi sono entrambi usando blocchi intrinseci. Il tuo primo esempio è usare il blocco intrinseco di lock, mentre il secondo sta usando il blocco intrinseco di this. La domanda è se this è davvero quello che vuoi bloccare, cosa che spesso non lo è.

Considera il caso, quando usi synchronized(this) All'interno di uno dei tuoi metodi. Hai 2 oggetti di questa classe e questi oggetti fanno riferimento a alcune risorse condivise. Se si blocca this Quindi non avrai esclusività reciproca a quella risorsa. È necessario bloccare un oggetto a cui tutto ciò che può accedere alla risorsa ha accesso.

Blocco su this Solo se la risorsa importante fa parte della classe stessa. Anche allora in alcuni casi un oggetto di blocco è migliore. Inoltre, se ci sono diverse risorse nella tua classe, che non devono essere reciprocamente esclusive nel loro insieme, ma individualmente, è necessario diversi oggetti di blocco.

La chiave è solo sapere come sincronizzato funziona e sii consapevole di ciò che il tuo codice sta effettivamente facendo

In realtà, usando i due non fa alcuna differenza, si tratta più di scelta/stile, gli scrittori API bloccano l'oggetto -eiter, Oppure usa un monitor interno dipende dalla condivisione di una risorsa, potresti non voler accedere agli utenti API del blocco interno o potresti voler dare la scelta agli utenti API per condividere il blocco intrinseco dell'oggetto.

In entrambi i casi nessuna di queste scelte è sbagliata, si tratta più dell'intenzione di tale blocco.

Leggi Concorrenza di Java nella pratica, questo ti renderà un maestro di concorrenza e chiarirà molti di questi concetti, che a volte sono più correlati alla scelta che fai piuttosto che alla correttezza.

Ogni oggetto ha solo un blocco intrinseco.

Con la parola chiave sincronizzata: Se si chiamano due metodi sincronizzati dallo stesso oggetto da due thread diversi, un thread anche un thread potrebbe eseguire il metodo uno e l'altro thread potrebbe eseguire il metodo due, ciò non avverrà perché entrambi i metodi condividono lo stesso blocco intrinseco (che appartiene al oggetto). E secondo quel thread dovrà attendere che l'altro thread finisca prima che possa acquisire il blocco intrinseco per eseguire l'altro metodo.

Ma se usi più serrature, ti assicurerai che solo un thread possa accedere al metodo uno alla volta e che un solo thread possa accedere al metodo due alla volta. Ma consentirai a quel metodo uno e il metodo due è possibile accedere a un thread ciascuno contemporaneamente e quindi ridurre il tempo richiesto per l'operazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top