Impasse
La vis est un outil très utile avec de nombreuses applications car il est très simple à utiliser et facile à comprendre. Mais en même temps, cela apportera également des ennuis, c'est-à-dire qu'il peut provoquer une impasse. Une fois une impasse, les fonctions du système ne seront pas disponibles. Regardons d'abord un morceau de code, qui provoquera des impasses, provoquant un thread thread_1 et du thread thread_2 à attendre les uns les autres pour libérer le verrou.
Thread de package; classe publique DeadlockDemo {chaîne statique privée a = "a"; chaîne statique privée b = "b"; public static void main (String args []) {new Deadlockdemo (). Deadlock ();} private void daadlock () {// thread thread_1 thread thread_1 = newrefre {System.err.println ("- thread_1 Lock A ----"); synchronisé (b) {System.err.println ("- Thread_1 Lock B ----");}}}}); // Thread Thread_2 Thread Thread_2 = New Thread (new Runnable () {@Override public Void run () {Synchronized (b) {System.out.println ("- Thread_2 Lock B -----"); synchronisé (a) {System.out.println ("- Thread_2 Lock A ----");}}}}); thread_1.start (); thread_2.start ();}}}}Ce code n'est qu'une démonstration de scénarios de blocage, et en réalité vous ne pouvez pas écrire un tel code. Mais dans certains scénarios plus complexes, vous pouvez rencontrer de tels problèmes, tels que Thread_1 n'a pas libéré le câble parce que certaines situations anormales (boucle morte). Ou thread_1 obtient un câble de base de données, et une exception est lancée lors de la libération du verrou, mais elle n'est pas publiée.
Une fois une impasse, l'entreprise est perceptible car le service ne peut pas être fourni. Ensuite, vous ne pouvez vérifier que le thread a le problème via le thread de vidage. Les informations sur le fil suivant nous indiquent que les lignes 35 et 21 de la classe Deadlockdemo ont provoqué l'impasse.
"Thread-1" prio = 6 tid = 0x000000000cb13800 NID = 0x19AC En attendant l'entrée du moniteur [0 x000000000d67f000] java.lang.thread.state: bloqué (sur objet Monitor) sur thread.deadlockdemo 2.Run (daDlockdemo.java:35) - Waiting to Lock java.lang.string) - verrouillé <0x00000007d5a9beb8> (a java.lang.string) sur java.lang.thread.run (source inconnue) "thread-0" prio = 6 tid = 0x000000000000cb0e800 nid = 0x6bc en attente de moniteur [0x 000000000d48f000] java.lang.thread.state: bloqué (sur moniteur d'objet) sur thread.deadlockdemo 1 $. java.lang.thread.run (source inconnue)
Plusieurs façons courantes d'éviter les blocs de bloces.
Évitez d'acquérir plusieurs verrous en même temps qu'un fil.
Évitez un thread occupant plusieurs ressources en même temps dans la corde et essayez de vous assurer que chaque corde ne consomme qu'une seule ressource.
Essayez d'utiliser la recherche chronométrée, en utilisant Lock.trylock (Timeout) au lieu d'utiliser le mécanisme de recherche interne.
Pour les câbles de base de données, le verrouillage et le déverrouillage doivent être dans une connexion de base de données, sinon le déverrouillage échouera.
référence:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
Résumer
Ce qui précède est l'analyse complète du code des méthodes communes de Java pour éviter les impasses dans cet article. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!