Sincronizzazione in Java: cosa, come e perché?



Questo articolo sulla sincronizzazione in Java ti aiuterà a guidarti nell'apprendimento della sincronizzazione dei programmi multi-thread.

I programmi multi-thread possono presentare regolarmente una circostanza in cui più file tentare di accedere alla stessa risorsa che produce risultati fraudolenti e sorprendenti. Questo può essere risolto utilizzando la sincronizzazione in Java. Solo un singolo thread specifico può raggiungere la risorsa in un determinato scopo di tempo. Questo articolo ti aiuterà a familiarizzare con la strategia di sincronizzazione.

Discuterò gli argomenti in questo ordine:





Iniziamo!

Perché utilizzare la sincronizzazione in Java?



Se inizi con almeno due thread all'interno di un programma, potrebbe esserci una possibilità quando più thread tentano di raggiungere la stessa risorsa. Può persino creare un risultato imprevisto a causa di problemi di concorrenza.

Sintassi :

synchronized (objectidentifier) ​​{// Accesso alle variabili condivise e ad altre risorse condivise}

Per esempio, tentare di scrivere all'interno di un file equivalente. Ciò potrebbe danneggiare i dati poiché uno dei thread può sovrascrivere i dati o quando un thread sta aprendo il filestesso file contemporaneamente, un altro thread potrebbe chiudere lo stesso file.È necessario sincronizzare l'azione di più thread. Questo può essere implementato utilizzando un concetto chiamato M onitors .



cos'è una sottostringa in java
  • Ogni è associato a un monitor, che un thread può bloccare o sbloccare.
  • Solo un thread alla volta può mantenere un blocco su un monitor.
  • Giava il linguaggio di programmazione fornisce un modo molto pratico per creare thread e sincronizzare le loro attività utilizzando il Sincronizzato blocchi.
  • Mantiene anche le risorse condivise all'interno di questo particolare blocco.

I blocchi sincronizzati in Java sono contrassegnati con l'estensione Sincronizzato parola chiave. Questo blocco in Java è sincronizzato su qualche oggetto.Tutti i blocchi sincronizzati sullo stesso oggetto possono avere un solo thread in esecuzione al loro interno alla volta. Tutti gli altri thread che tentano di entrare nel blocco sincronizzato vengono bloccati finché il thread all'interno del blocco sincronizzato non esce dal blocco.

Tipi di sincronizzazione

Esistono fondamentalmente due tipi di sincronizzazione disponibili. Sono:

  1. Sincronizzazione del processo: L'esecuzione simultanea di più thread o processi per raggiungere uno stato tale da eseguire il commit in una determinata sequenza di azioni.
  2. Sincronizzazione thread: A volte quando più di un threadtenta di accedere a una risorsa condivisa, è necessario assicurarsi che la risorsa verrà utilizzata da un solo thread inun tempo.

Non entriamo nei dettagli di questi tipi e cerchiamo di capire cosa sono i blocchi .

Blocca in Java

Come accennato in precedenza, la sincronizzazione è basata su un'entità interna nota come serratura o tenere sotto controllo . A ogni oggetto è associato un lucchetto. Quindi un thread che necessita di un accesso coerente ai campi di un oggetto deve acquisire il blocco dell'oggetto prima di accedervi e quindi rilasciare il blocco al termine del lavoro.

Da Java 5, il pacchetto java.util.concurrent.locks contiene molte implementazioni di blocco.

Ecco come appare un lucchetto:

public class Lock {private boolean isLocked = false public synchronized void lock () throws InterructedException {while (isLocked) {wait ()} isLocked = true} public synchronized void unlock () {isLocked = false notify ()}}

Il metodo lock () blocca l'istanza Lock in modo che tutti i thread che chiamano lock () siano bloccati fino a quando non viene eseguito unlock ().

Multi-threading senza sincronizzazione

Ecco un semplice esempio che stampa il valore del contatore in una sequenza e ogni volta che lo eseguiamo, produce un risultato diverso in base alla disponibilità della CPU per un thread. Controllalo!

class Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

I risultati del programma precedente in questo:

Sincronizzazione dell

Multi-threading con sincronizzazione

Questo è lo stesso esempio di sopra ma stampa il valore del contatore nella sequenza. Ogni volta che lo eseguiamo, produce lo stesso risultato.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Eccezione e) {System. out.println ('Thread interrotto.')}}} classe Thread estende Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Thread T1 = nuovo Thread (' Thread - 2 ', MT) T.start () T1.start () // aspetta che i thread finiscano prova {T.join () T1.join ()} catch (Eccezione e) {System.out.println ('Interrotto')}}}

L'output è illustrato di seguito:

Parola chiave sincronizzata

parola chiave sincronizzata contrassegna un blocco o un metodo come sezione critica. Una sezione critica è dove viene eseguito un solo thread alla volta e il thread mantiene il blocco per la sezione sincronizzata. Questo sincronizzato la parola chiave aiuta nella scrittura simultaneo parti di qualsiasi applicazione. Protegge anche le risorse condivise all'interno del blocco.

La parola chiave sincronizzata può essere utilizzata con:

Parliamo del blocco di codice.

Parola chiave sincronizzata: un blocco di codice

Sintassi

La sintassi generale per scrivere un blocco sincronizzato è:

sincronizzato (lockObject) {// istruzioni sincronizzate}

Quando un thread vuole eseguire le istruzioni sincronizzate all'interno del blocco, deve acquisire il blocco sul monitor di lockObject. Un solo thread alla volta può acquisire il monitor di un oggetto di blocco. Quindi tutti gli altri thread devono attendere che il thread attualmente in esecuzione acquisisca il blocco e termini la sua esecuzione.
In questo modo, il file sincronizzato La parola chiave garantisce che un solo thread eseguirà le istruzioni di blocco sincronizzate alla volta e quindi impedisce a più thread di danneggiare i dati condivisi presenti all'interno del blocco.

Nota :

  • Se un thread viene messo in sospensione (utilizzando dormire() metodo) quindi non rilascia il blocco. Durante questo tempo di sospensione, nessun thread eseguirà le istruzioni di blocco sincronizzate.
  • La sincronizzazione di Java verrà lanciata NullPointerException se l'oggetto blocco utilizzato in ' sincronizzato (blocco) ' è zero.

Ora, parliamo del metodo.

Parola chiave sincronizzata: Un metodo

Sintassi

La sintassi generale per scrivere un file metodo sincronizzato è:

metodo sincronizzato (parametri) {// codice sincronizzato}

Qui lockObject è solo un riferimento a un oggetto il cui blocco è associato al monitor che rappresenta le istruzioni sincronizzate.

Simile al blocco sincronizzato, un thread deve acquisire il blocco sull'oggetto monitor connesso con il metodo sincronizzato. Nel caso del metodo sincronizzato, l'oggetto lock è:

  • Oggetto '.class' - se il metodo dato è statico .
  • 'Questo' oggetto - se il metodo è non statico . 'Questo' è il riferimento all'oggetto corrente in cui viene richiamato il metodo sincronizzato.

La parola chiave sincronizzata Java è rientrante in natura. Significa che se un metodo sincronizzato chiama un altro metodo sincronizzato che richiede lo stesso blocco, il thread corrente che detiene il blocco può entrare in quel metodo senza acquisire il blocco.

Passiamo all'argomento finale di questo articolo e evidenziamo le principali differenze tra la parola chiave sincronizzata e il blocco di sincronizzazione.

Differenza tra parola chiave sincronizzata e blocco sincronizzato

  • Quando si utilizza una parola chiave sincronizzata con un file metodo , acquisisce un blocco nell'oggetto per l'intero metodo. Ciò significa che nessun altro thread può utilizzare alcun metodo sincronizzato fino a quando il thread corrente richiamato non ha terminato la sua esecuzione.
  • Sincronizzato bloccare acquisisce un blocco nell'oggetto solo tra parentesi dopo aver specificato la parola chiave sincronizzata. Ciò significa che nessun altro thread può acquisire un blocco sull'oggetto già bloccato fino alla chiusura del blocco. Ma altri thread potranno accedere al resto del codice presente nel metodo.

Questo ci porta alla fine di questo articolo in cui abbiamo discusso di come funziona esattamente la sincronizzazione in Java. Spero che tu sia chiaro con tutto ciò che è stato condiviso con te in questo tutorial.

Controlla il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Siamo qui per aiutarti in ogni fase del tuo viaggio, per diventare oltre a queste domande di intervista Java, abbiamo creato un curriculum progettato per studenti e professionisti che vogliono essere uno sviluppatore Java.

Hai domande per noi? Si prega di menzionarlo nella sezione commenti di questo 'Sincronizzazione in Java ' articolo e ti risponderemo il prima possibile.