Deadlock in Java

Deadlock in Java
Java fornisce un concetto di multithreading che consente a un processo di eseguire più di un thread contemporaneamente. Il multithreading offre una vasta gamma di vantaggi come il massimo utilizzo della CPU, il tempo di risparmio, il costo di manutenzione decrescente, ecc. Tuttavia, ha anche alcuni svantaggi e tra questi, la limitazione più comune è che più thread vanno in uno stato di attesa e sono bloccati per sempre e questa situazione è chiamata deadlock in Java.

In questo articolo, impareremo gli aspetti sotto l'elenco dei deadlocks in Java:

  • Cos'è uno stallo?
  • Quando e dove può verificarsi un deadlock
  • Esempi di deadlock
  • Come prevenire uno stallo in Java

Quindi iniziamo!

Cos'è uno stallo?

Deadlock descrive una situazione in cui altri due thread stanno cercando di accedere alla stessa risorsa contemporaneamente e, di conseguenza, nessuno ottiene la risorsa e alla fine viene bloccato per sempre.

Quando e dove può verificarsi un deadlock

In Java, lo scenario di deadlock può verificarsi solo nell'ambiente multithread in cui si esegue più di un thread contemporaneamente. Inoltre, una parola chiave sincronizzata può causare uno stallo in java.

Dalla figura sopra, possiamo osservare che thread1 è in attesa di thread2 per rilasciare le risorse e viceversa.

Esempi di deadlock

Consideriamo l'esempio di seguito per una profonda comprensione di come si verifica uno stallo in Java:

classe pubblica deadlockexample
public static void main (string [] args)
stringa finale res1 = "prima risorsa";
stringa finale res2 = "seconda risorsa";
Thread thread1 = new thread ()
public void run ()
sincronizzato (res1)
Sistema.fuori.println ("thread 1: bloccato la res1");
Tentativo
Filo.Sleep (2000);
catch (eccezione eccetto)

sincronizzato (res2)
Sistema.fuori.println ("thread 1: bloccato il res2");



;
Thread thread2 = new thread ()
public void run ()
sincronizzato (res2)
Sistema.fuori.println ("thread 2: bloccato il res2");
Tentativo
Filo.Sleep (2000);
catch (eccezione eccetto)

sincronizzato (res1)
Sistema.fuori.println ("thread 2: bloccato la res1");



;
Discussione1.inizio();
Discussione2.inizio();

In questo esempio, abbiamo due thread thread1 e thread2, entrambi i thread iniziano e chiamano il metodo run ().

Il seguente sarà l'output per lo snippet sopra:

Dallo snippet sopra, è chiaro che entrambi i fili si sono bloccati.

Come prevenire uno stallo in Java

Di seguito è riportato l'elenco di prevenzioni che possono essere adottate per evitare uno stallo in Java:

  • Evita l'uso di blocchi nidificati e non necessari.
  • Acquisire le serrature nello stesso ordine.
  • Usa thread join per evitare lo stallo i.e., Rilasciare un blocco dopo un periodo di timeout.

Conclusione

Deadlock descrive una situazione in cui altri due thread stanno cercando di accedere alla stessa risorsa contemporaneamente e, di conseguenza, nessuno ottiene la risorsa e alla fine viene bloccato per sempre. In Java, un deadlock si verifica solo nell'ambiente multithread dove più di un thread esegue contemporaneamente. Inoltre, una parola chiave sincronizzata può causare uno stallo in java. In Java, uno stallo non può essere risolto completamente, tuttavia, può essere evitato adottando alcune precauzioni/regole necessarie e.G. Evitare l'uso di blocchi non necessari, serrature nidificate, ecc.

Questo articolo presenta una panoramica dettagliata di quelli che sono i deadlocks in Java, come si verificano deadlock e come evitare i deadlocks in Java.