Le blocage est un problème courant en programmation concurrente et peut être évité ou traité en prenant des mesures : Prévenir les blocages : - Acquisition des verrous dans l'ordre - Éviter l'attente cyclique - Utilisation du mécanisme de délai d'attente - Gestion des blocages à l'aide de structures de données non bloquantes : - Détection des blocages - Opération de récupération et de nouvelle tentative de blocage
Prévention et gestion des blocages dans la programmation simultanée Java
Le blocage est un problème courant qui peut être rencontré dans la programmation simultanée, qui fait que plusieurs threads s'attendent les uns les autres. Libère des ressources, provoquant le système jusqu’à l’impasse. En Java, les blocages peuvent être évités ou gérés en prenant les mesures appropriées.
Prévenir les blocages
Gestion des blocages
Si les mesures préventives ne parviennent pas à éviter les blocages, vous pouvez gérer les blocages en :
Cas pratique
Considérez l'extrait de code Java suivant :
public class DeadlockExample { private final Object lock1 = new Object(); private final Object lock2 = new Object(); public void method1() { synchronized (lock1) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); } } } public void method2() { synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); } } } public static void main(String[] args) { DeadlockExample deadlockExample = new DeadlockExample(); Thread thread1 = new Thread(deadlockExample::method1); Thread thread2 = new Thread(deadlockExample::method2); thread1.start(); thread2.start(); } }
Dans cet exemple, deux threads (thread1 et thread2) sont synchronisés en utilisant respectivement lock1 et lock2. Étant donné que les deux threads acquièrent les verrous dans l’ordre inverse, ils attendent que l’autre libère le verrou, ce qui entraîne un blocage.
Pour éviter les blocages, nous pouvons modifier le code pour acquérir les verrous dans l'ordre :
public class DeadlockExample { private final Object lock1 = new Object(); private final Object lock2 = new Object(); public void method1() { synchronized (lock1) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); } } } public void method2() { synchronized (lock2) { System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2"); synchronized (lock1) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1"); } } } public static void main(String[] args) { DeadlockExample deadlockExample = new DeadlockExample(); Thread thread1 = new Thread(deadlockExample::method1); Thread thread2 = new Thread(deadlockExample::method2); thread1.start(); thread2.start(); } }
En modifiant le code, nous nous assurons que thread1 et thread2 acquièrent toujours les verrous dans le même ordre (lock1 puis lock2), évitant ainsi les blocages.
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!