Maison  >  Article  >  Java  >  Qu’est-ce qu’une impasse dans l’apprentissage simultané de Java ? Introduction à l'impasse

Qu’est-ce qu’une impasse dans l’apprentissage simultané de Java ? Introduction à l'impasse

青灯夜游
青灯夜游avant
2018-10-22 17:48:132598parcourir

Le contenu de cet article concerne l'apprentissage simultané de Java. Qu'est-ce qu'un blocage ? Introduction à l'impasse. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

  • Introduction au blocage :
    Lock est un outil très utile qui s'exécute dans de nombreux scénarios car il est très simple à utiliser et facile à comprendre. Mais en même temps, cela entraînera également certains problèmes, tels que des problèmes de blocage. Par exemple, il existe deux threads A et B, qui nécessitent tous deux deux ressources a et b pour s'exécuter. A obtient la ressource a et B obtient la ressource b. Ensuite, A demande la ressource b et B demande la ressource a. Les deux threads se bloquent et provoquent un blocage.

  • Exemple de code :

public calss DeadLockDemo{
	private static String A = "A";
	private static String B = "B";
	public static void main(String[] args){
		new DeadLockdemo().deadLock();
	}
	private void deadLock(){
		Thread t1 = new Thread(new Runnable(){
			@Override
			public void run(){
				synchronized(A){
					try{
						Thread.currentThread().sleep(2000);
					}catch(Exception e){
					  e.printStackTrace();
					 }
					 synchronized(B){
					 	System.out.println("B");
					 }
				}
			}
		});
		Thread t2 = new Thread(new Runnable(){
			@Override
			public void run(){
				synchronized(B){
					try{
						Thread.currentThread().sleep(2000);
					}catch(Exception e){
					  e.printStackTrace();
					 }
					 synchronized(A){
					 	System.out.println("A");
					 }
				}
			}
		});
		t1.start();
		t2.start();
	}
}

Un blocage se produira après l'exécution du code ci-dessus, et t1 et t2 se bloquent mutuellement.

  • Analyse de scénario de blocage :
    Dans un scénario plus complexe, vous pouvez rencontrer un tel problème après que t1 ait obtenu le verrou, en raison de certaines conditions anormales sans libérer le verrou (infini. boucle). Ou t1 a obtenu un verrou de base de données, et lors de la libération du verrou, une exception a été levée mais n'a pas été libérée.

  • Plusieurs façons d'éviter les blocages :
    1. Essayez d'éviter qu'un thread n'acquière plusieurs verrous en même temps.
    2. Essayez d'éviter qu'un thread n'occupe plusieurs supports en même temps et essayez de n'occuper qu'une seule ressource à la fois.
    3. Essayez d'utiliser le verrouillage horaire. Lock.tryLock(timeout) utilise à la place le mécanisme de verrouillage interne.
    4. Pour les verrouillages de base de données, le verrouillage et le déverrouillage doivent être effectués au sein d'une connexion à la base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer