Java >> Tutoriel Java >  >> Java

Qu'est-ce que Deadlock, comment l'analyser et l'éviter en java ?

Interblocage en Java

  • Lorsque deux threads attendent l'un l'autre pour toujours signifie (c'est-à-dire qu'il n'a pas la possibilité d'entrer dans une file d'attente prête), ce type d'attente infinie est appelé blocage.
  • Un interblocage se produit lorsque le processus en attente conserve encore une autre ressource dont le premier a besoin avant de pouvoir se terminer.
  • En utilisant un mot-clé synchronisé, nous pouvons nous diriger vers une situation de blocage. Il n'est pas recommandé d'appliquer inutilement le mot-clé de synchronisation.
  • Nous ne pouvons pas résoudre l'impasse, mais nous pouvons éviter une situation d'impasse grâce à plusieurs techniques.

Comment pouvons-nous analyser une situation de blocage ?

  • Si tous les threads n'ont qu'un seul objet, nous pouvons utiliser un graphique appelé wait-for-graph.
  • S'il existe plusieurs objets pour un seul thread en tant que cycle, alors l'attente de graphique ne fonctionnera pas, nous devrions opter pour une solution telle que l'algorithme du banquier dans le système d'exploitation pour détecter un blocage.

Dans l'exemple donné, ci-dessous, nous verrons la situation de blocage :

Exemple :

class HelloClass{
	public synchronized void first(HiClass hi)
	{
		try{
			Thread.sleep(1000);
		}
		catch(InterruptedException ie){}
		System.out.println(" HelloClass is calling 	HiClass second() method");
		hi.second();
	}

	public synchronized void second(){
		System.out.println("I am inside second method of HelloClass");
	}
}

class HiClass{
	public synchronized void first(HelloClass he)
	{
		try{
			Thread.sleep(1000);
		}
		catch(InterruptedException ie){}
		System.out.println(" HiClass is calling HelloClass second() method");
		he.second();
	}

	public synchronized void second(){
		System.out.println("I am inside second method of HiClass");
	}
}

class DeadlockClass extends Thread{
	HelloClass he = new HelloClass();
	HiClass hi = new HiClass();

	public void demo(){
		this.start();
		he.first(hi);
	} 
	public void run(){
		hi.first(he);
	}

	public static void main(String[] args){
		DeadlockClass dc = new DeadlockClass();
		dc.demo();
	}
}

Sortie

D:\Java Articles>java DeadlockClass
HelloClass is calling HiClass second() method
HiClass is calling HelloClass second() method

Balise Java