La détection de blocage en Java
Il y a longtemps, j'ai sauvé une phrase à partir d'un Java livre de référence: "Java n'a pas de mécanisme de poignée de blocage. il ne sait même pas de blocage s'est produit." (La tête la Première, Java 2nd Edition, p.516)
L'affirmative, quelle est-elle? Est-il un moyen de rattraper impasse cas en Java? Je veux dire, est-il possible que notre code comprend une impasse cas s'est produit?
- Est Java différent dans d'autres langues à cet égard?
- il n'est pas impossible de détecter un blocage - c'est juste assez difficile
- par exemple la plupart des bases de données permettra de détecter les blocages
- Java peut ne pas disposer d'un mécanisme à "gérer" les blocages, mais il le FAIT savoir sur les blocages. Lire mon post ci-dessous et je vais expliquer comment...
- N'est-ce pas à cette question, un doublon de: stackoverflow.com/questions/1102359
Vous devez vous connecter pour publier un commentaire.
Depuis le JDK 1.5 il y a des méthodes utiles dans le
java.lang.management
paquet de trouver et d'inspecter les blocages qui se produit. Voir lafindMonitorDeadlockedThreads()
etfindDeadlockedThreads()
méthode de laThreadMXBean
classe.Une façon possible de l'utiliser c'est d'avoir un chien de garde thread (ou tâche périodique) qui fait cela.
Exemple de code:
JConsole est capable de détecter les blocages dans une application en cours d'exécution.
JDK 5 et 6 de vidage de la tenue de verrouillage de l'information dans un thread dump (obtenu avec kill -3, jstack, jconsole, etc). JDK 6 contient des informations sur ReentrantLock et ReentrantReadWriteLock. Il est possible à partir de cette information pour diagnostiquer un blocage par trouver un verrouillage du cycle: le Fil d'Un titulaire de verrouillage 1, le Fil B est titulaire de la serrure 2, et soit d'Une demande de 2 ou B demande 1. De mon expérience, ce n'est généralement assez évident.
D'autres outils d'analyse peut effectivement trouver les blocages potentiels, même si elles ne se produisent pas. Outils de la discussion des vendeurs tels que OptimizeIt, JProbe, Coverity, etc sont de bons endroits pour chercher.
Remarque qu'il y a un type de blocage à l'aide de la simultanées paquet qui est très difficile à déboguer. C'est là que vous avez un ReentrantReadWriteLock et un thread attrape le verrou en lecture et ensuite (dire) essaie d'entrer dans un moniteur détenus par un autre thread qui est également en attente pour saisir le verrou d'écriture. Ce qui le rend particulièrement difficile à déboguer est qu'il n'y a aucune trace de qui est entré dans un verrou en lecture. C'est tout simplement un chef d'accusation. Le thread peut même avoir jeté une exception et est décédé en laissant le lire le nombre non nul.
Voici un exemple d'une impasse que l'findDeadlockedThreads méthode mentionné plus tôt, de ne pas obtenir de:
En général java ne propose pas de détection de blocage. Le mot-clé synchronized et construit dans les moniteurs de le rendre un peu plus difficile à propos de l'impasse que dans les langues explicite de verrouillage.
Je suggère de migration à l'aide de java.util.de façon concomitante.Verrouille et afin de faire votre installation de fermeture régimes plus facile de raisonner sur. En fait, vous pouvez facilement faire votre propre implémentation de l'interface de verrouillage avec détection de blocage. L'algorithme consiste pour l'essentiel à traverser la serrure graphe de dépendance et de regarder pour un cycle.
Si vous êtes sur Java 5, vous pouvez appeler la méthode
findMonitorDeadlockedThreads()
sur le ThreadMXBean que vous pouvez obtenir grâce à un appel dejava.lang.management.ManagementFactory.getThreadMXBean()
. Cela permettra de trouver les blocages causés par des objets surveille uniquement. Sur la version 6 de Java il y afindDeadlockedThreads()
qui sera également trouver des blocages causés par des "ownable synchroniseurs (par exempleReentrandLock
etReentrantReadWriteLock
).Être conscient qu'il sera probablement coûteux d'appeler ces méthodes, elles doivent donc être utilisées pour des fins de dépannage.
Des blocages peuvent être évités si vous suivez une règle simple: avoir tous les threads de réclamation et quittance leurs verrous dans le même ordre. De cette façon, vous ne jamais être dans une situation où un blocage peut se produire.
Même à manger des philosophes problème peut être vu comme une violation de cette règle, car il utilise une relative concepts de droite et de gauche cuillère qui résultat dans différents threads à l'aide de différents répartition des ordonnances de la cuiller. Si les cuillères ont été numérotés de façon unique et les philosophes ont tous essayé d'obtenir le plus petit numéro de cuillère d'abord, blocage serait impossible.
À mon avis, mieux vaut prévenir que guérir.
C'est l'une des deux lignes directrices j'aime à suivre pour garantir que les threads de travail correctement. L'autre est de s'assurer que chaque thread est uniquement responsable de sa propre exécution, comme c'est le seul que pleinement conscient de ce qu'il fait à n'importe quel point dans le temps.
Ce qui signifie que pas de
Thread.stop
des appels, utiliser un indicateur global (ou file d'attente de message ou quelque chose comme ça) de dire à un autre thread que vous voulez de l'action prise. Alors laissez ce thread faire le travail réel.Pas exactement ce que vous avez demandé, mais lorsqu'un blocage ne se produire, vous pouvez faire un "kill -3" sur l'id de processus et elle exporte un thread dump sur la sortie standard stdout. Aussi, la jvm 1.6 a quelques outils pour faire la même chose dans une interface graphique manière.
Si vous exécutez à partir de la ligne de commande et vous pensez que vous êtes dans l'impasse, essayez d'appuyer sur ctrl+pause dans windows (ctrl+\ sous unix) pour obtenir un thread dump.
Voir http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/gbmps.html
Le dr Heinz Kabutz de JavaSpecialists a écrit un divertissant et instructif bulletin d'information sur Java blocages et décrit quelque chose qui s'appelle un ThreadMXBean dans un autre numéro de ce bulletin. Entre ceux-ci, vous devriez avoir une bonne idée des problèmes et quelques conseils pour faire votre propre instrumentation.
Java peut détecter les blocages (mais pas au moment de l'exécution, il peut diagnostiquer et de le signaler).
Par exemple, lors de l'utilisation d'une version légèrement modifiée de " Saurabh M. Chande code soufflet (changé en Java et ajouté un peu de timing pour garantir un verrou sur chaque course). Une fois que vous l'exécutez, et il les blocages, si vous tapez:
Il va générer un dump de la pile, qui comprendra les informations suivantes:
Si vous êtes le débogage dans eclipse, vous pouvez mettre en pause l'application (sélectionnez l'application dans la vue débogage et le peu de || sur le bouton de barre d'outils de débogage) et puis il peut signaler les blocages.
Voir http://runnerwhocodes.blogspot.com/2007/10/deadlock-detection-with-eclipse.html pour un exemple.
Java 5 introduit ThreadMXBean - une interface qui offre diverses méthodes de surveillance pour les threads. ... La différence est que findDeadlockedThreads peut également détecter les blocages causés par le propriétaire de serrures (java.util.en même temps), alors que findMonitorDeadlockedThreads ne peut détecter le moniteur de serrures (c'est à dire synchronisé blocs)
Ou vous pouvez le détecter par programmation, reportez-vous à cette https://dzone.com/articles/how-detect-java-deadlocks
Après si longtemps, je suis en mesure d'écrire l'exemple le plus simple de Blocage.
Les commentaires sont les bienvenus.
vous devez modifier un peu le code dans le Blocage de la Classe
Également le code ci-dessus ne sera pas toujours la cause d'une mort serrure, seulement quelques fois, il peut arriver.