Maison >Java >javaDidacticiel >Comment réparer : erreur de concurrence Java : blocage du thread
Comment résoudre : Erreur de concurrence Java : blocage des threads
Introduction :
En programmation simultanée, le blocage des threads est un problème très courant. Lorsque plusieurs threads sont en compétition pour les ressources, un blocage peut se produire si les threads attendent les uns les autres pour libérer des ressources. Cet article présentera le concept de blocage de thread, ses causes et comment résoudre ce problème.
3.1 Éviter l'attente circulaire
L'attente circulaire est l'une des principales causes de blocage des threads. Afin d'éviter une attente circulaire, vous pouvez utiliser un algorithme de tri des ressources, qui oblige les threads à acquérir les verrous dans un certain ordre et à les libérer dans le même ordre. Cela élimine la possibilité d’attendre en boucle.
3.2 Unifier l'ordre de verrouillage
Une situation courante dans l'impasse des threads est que différents threads acquièrent des verrous dans des ordres différents, ce qui les oblige à s'attendre les uns les autres. Pour résoudre ce problème, on peut stipuler que tous les threads doivent acquérir les verrous dans le même ordre. Cela peut éviter l'apparition d'un blocage de séquence de verrouillage.
3.3 Utiliser le mécanisme de délai d'attente de verrouillage
Dans la programmation multi-thread, le mécanisme de délai d'attente de verrouillage peut être utilisé pour éviter un blocage de thread. Lorsqu'un thread tente d'acquérir un verrou pendant plus d'un certain délai et ne parvient pas à acquérir le verrou, il peut choisir d'abandonner l'acquisition du verrou et d'essayer d'autres méthodes de traitement.
Ce qui suit est un exemple de code qui utilise le mécanisme de délai d'attente du verrou pour éviter le blocage des threads :
public class DeadlockExample { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (lock1) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread 1"); } } }).start(); new Thread(() -> { synchronized (lock2) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("Thread 2"); } } }).start(); // 设置超时时间为2秒 CompletableFuture<Object> future = CompletableFuture.supplyAsync(() -> { while (true) { if (Thread.holdsLock(lock1) && Thread.holdsLock(lock2)) { return true; } } }).orTimeout(2000, TimeUnit.MILLISECONDS); try { future.get(); } catch (TimeoutException e) { System.out.println("Deadlock detected!"); // 执行适当的处理逻辑 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }
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!