Est-il possible pour un thread de Blocage lui-même?
Est-il techniquement possible pour un thread en Java à l'impasse de lui-même?
M'a demandé lors d'une interview d'un moment de retour et a répondu qu'il n'était pas possible, mais l'enquêteur m'a dit qu'il est. Malheureusement je n'ai pas pu obtenir de sa méthode sur la façon d'atteindre cette impasse.
Cela m'a fait réfléchir et la seule situation que je peux penser est l'endroit où vous pouvez avoir de ce lieu est l'endroit où vous avez un RMI processus serveur qui contient une méthode qui s'appelle elle-même. La ligne de code qui appelle la méthode est placé dans un bloc synchronisé.
Si, c'est possible ou a été l'interviewer incorrect?
Le code source je pensais à l'est le long de ces lignes (où testDeadlock est en cours d'exécution dans un RMI processus de serveur)
public boolean testDeadlock () throws RemoteException {
synchronized (this) {
//Call testDeadlock via RMI loopback
}
}
- Synchronisé appels RMI de cette méthode permettrait seulement de mettre en file d'attente le RMI expédition threads sur le moniteur de ce RemoteObject sur le côté serveur.
- Le but de ce genre de chasse aux sorcières des questions d'entrevue m'échappe. Il rend l'ensemble du processus apparente davantage à un jeu de montrer que pour une entrevue. Je suis sûr que l'intervieweur croit qu'il a découvert quelques valeurs aberrantes et pensé qu'il serait un grand tour de la question. Mais quel est le point? Je suis curieux de voir ce que le reste de l'interview a été comme? J'ai tendance à couvrir mes réponses à des questions comme celle-ci par discuter les concepts impliqués plus que de donner un caractère définitif. Ce qui va à l'encontre de mon naturellement objectif de la disposition, mais dans ces situations, il semble approprié.
- Je me demande si le journaliste avait quelque chose comme une pthreads non-récursive mutex dans l'esprit. À partir de la pthreads de la documentation: "normal mutex ne peut pas être verrouillé à plusieurs reprises par le propriétaire. Les tentatives par un fil à relock déjà tenu mutex, [...] suite à une situation de blocage." IIRC Java les mutex sont un peu plus intelligents que cela.
- Peut-être la meilleure réponse aurait été "Pas si vous M'avez eu à écrire le code!"
- Je ne le pense pas. Un thread peut juste faire une chose à la fois. il ne peut donc pas faire un peu de travail et aussi attendre autre chose de complet
- Je ne pense pas, n'ai pas entendu parler de blocages en mono-thread applications ..
- Un RMI de bouclage qui allait se passer dans un thread séparé. Ce n'est pas une instance d'un fil de blocage lui-même. Je suis entièrement d'accord avec @Sorax. Certains enquêteurs ne peuvent pas aider à montrer. La question n'est pas pertinente pour n'importe quelle situation en matière de développement que j'ai jamais rencontrés, ou à tout iphring décision. Si l'intervieweur est si bien informé qu'il doit avoir un intérêt dans l'éducation de ses employés comme nécessaire, et aussi dans le débat sur ce genre de choses de manière rationnelle plutôt que de les déposer en tant que les conditions d'entrée.
- J'ai accidentellement réussi à blocage du fil... Il attend son propre objet de verrouillage pour libérer l'objet qu'il veut (et non, je n'ai pas incorporer des objets verrous). Ou au moins, c'est comment le débogueur Eclipse montre. Edit: Ce n'est vraiment pas, je ne l'ai pas vérifier correctement l'attente des Id de thread.
Vous devez vous connecter pour publier un commentaire.
Se basant sur la définition de:
Je dirais que la réponse n'est pas sûr qu'un thread peut s'y asseoir pour attendre indéfiniment pour quelque chose, mais à moins que deux actions concurrentes sont en attente pour l'autre il est, par définition, pas un blocage.
À moins que quelqu'un m'explique comment un seul thread peut être en même temps d'attente pour deux actions à la fin?
Mise à JOUR: La seule situation possible que je peux penser est une sorte de message de la pompe, où un thread traite un message qui demande de l'attendre indéfiniment quelque chose arriver, où, en fait, que quelque chose seront traitées par un autre message sur le message de la pompe.
Ce (incroyablement fictive) scénario peut éventuellement être techniquement appelé un blocage.
how a single thread can be simultaneously waiting for two actions to finish?
Parce qu'à un certain niveau, un thread est qu'une abstraction, sinon vous vous retrouvez dans une reductio ad absurdum de laquelle un seul core de la machine ne peut pas être dans l'impasse.Cela dépend de ce que tu veux dire par "blocage" exactement. Par exemple, vous pouvez facilement
wait()
sur un moniteur qui rien ne serait jamais impulsion... mais je ne pense pas que je ferais appel de cette impasse, en tant que tel.La pensée le long de votre "méthode qui s'appelle" les lignes, si votre serveur n'a couru un certain nombre de fils, ils pourraient tous être occupé attente de réponses à partir du même serveur, si ce qui compte. (Exemple le plus simple: le serveur n'utilise qu'un seul thread pour le traitement. Si vous écrivez un gestionnaire de requêtes qui appelle dans le même serveur, il sera en attente pour le thread bloqué pour terminer le traitement de la demande avant qu'il puisse servir la même demande...) Ce n'est pas vraiment un "bloc synchronisé" une sorte de blocage, mais c'est certainement un danger pour l'être conscient.
EDIT: Pour appliquer cette réponse à la définition dans les autres, les actions concurrentes ici serait "valider la demande actuelle" et "gérer la nouvelle demande". Chaque action est en attente pour l'autre de se produire.
Thread.currentThread.join()
Peut-être qu'il voulait dire de VERROUILLAGE lui-même, qui est certainement trop facile:
wait()
sera certainement le verrouiller, et sans la coopération de l'autre thread, il ne sera pas en mesure de procéder.Peut-être ce que l'intervieweur a été pensée était:
Cependant, je dirais que ça ne compte pas comme un blocage.
La mise à niveau à partir d'un verrou en lecture à un verrou d'écriture (en essayant d'acquérir un verrou en écriture tout en maintenant un verrou en lecture) sera dans le thread se faire complètement bloqué. C'est qu'une impasse? À vous d'en juger... Mais c'est la façon la plus simple pour créer l'effet avec un seul thread.
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html
Un blocage est une forme de l'insuffisance de ressources avec une interaction entre plusieurs threads.
Lorsqu'un fil est dans un état de ressource sauvant lui-même, il est renvoyé à un absence de cycle non productif qui est similaire à une impasse, mais pas de la même façon par définition.
Un exemple d'une absence de cycle non productif est à l'aide de ReentrantReadWriteLock. En dépit d'être réentrant de lecture OU d'écriture, il ne permet pas la mise à niveau de la serrure de lire pour écrire.
résultats dans le processus de blocage ici
Une question connexe est de savoir; un fil d'arriver dans une impasse sans créer de nouveaux threads. C'est possible car il y a des threads d'arrière-plan par exemple, le finaliseur fil, qui permet d'exécuter le code de l'utilisateur dans l'arrière-plan. Cela permet pour le thread principal et le finaliseur fil de l'impasse les uns des autres.
Selon Wikipedia, "Un blocage est une situation dans laquelle deux ou plusieurs actions concurrentes sont chacun attendant de l'autre à la fin, et donc ni le fait jamais."
..."En informatique, Coffman blocage se réfère à une condition particulière lorsque deux ou plusieurs processus sont chacun attendant que l'autre la libération d'une ressource, ou plus de deux processus sont en attente de ressources dans une circulaire de la chaîne."
Je pense que deux ou plus de deux sont les maîtres-mots ici si vous restez stricte définition.
La JVM ne garde la trace du fil local qui a l'écran, si la classe d'appel rend un appel externe sur lui-même à l'appel entrant provoque le thread d'origine de blocage lui-même.
Vous devriez être en mesure d'exécuter ce code pour illustrer l'idée
La sortie du programme ressemble
En outre, le fil de vidage est le suivant
qui indique que le thread a en effet réussi à verrouiller lui-même
La réponse (Pram s) marqué comme étant correcte n'est pas techniquement un blocage comme d'autres l'ont suggéré. Ses juste bloqué.
Je dirais en Java, vous pouvez vous pencher sur Java de définition (ce qui est cohérent avec les deux thread idée). Le juge ultime, alors peut être la JVM si il détecte le blocage lui-même. Ainsi, dans le Landau de l'exemple, le thread montrer quelque chose comme si c'était un authentique impasse.
Cette détection de blocage a été disponible pour les intrinsèque des verrous depuis 1.5 et
Lock
base cyclique des blocages depuis 1.6.Une permanence des ressources bloquées, ou au moins quelque chose qui est en attente pour quelque chose qui n'arrivera jamais est appelé un absence de cycle non productif. Des problèmes similaires où les processus à l'extérieur de la machine virtuelle (par exemple) les bases de données de l'interblocage sont tout à fait possible, mais je dirais pas appropriées pour la question.
Je serais intéressé par une écriture de la façon dont l'enquêteur revendique son possible...
En réponse à votre question de départ, il faut être deux pour danser le tango et je vous suggère de Pram la réponse ne devrait pas être marqué comme étant correcte, car ne l'est pas! 😉 Le RMI thread qui appelle en retour peuvent provoquer le blocage, mais il s'exécute sur un autre thread (géré par le serveur RMI) que celle de la principale. Les deux fils sont impliqués, même si le thread principal n'a pas explicitement défini et un autre en haut. Il n'y a pas de blocage comme en témoigne l'absence de détection dans le thread dump (ou si vous cliquez sur "détecter l'impasse" dans jconsole), il sera plus précisément décrit comme une absence de cycle non productif.
Après avoir dit tout cela, toute discussion sur les lignes de chacun de ces réponses serait assez pour me satisfaire comme un enquêteur.
Alors que je n'ai pas utilisé de Java, j'ai dans l'impasse d'un seul thread de l'application avant de l'. IIRC: Routine verrouillé un morceau de données à mettre à jour. Routine B également verrouillé, le même morceau de données à mettre à jour. En raison de changements dans les exigences d'Un fini par appeler B. Oups.
Bien entendu, c'était juste un ordinaire de développement bug que j'ai attrapé la première fois que j'ai essayé d'exécuter le code, mais il n'a blocage lui-même. Je pense que les blocages de ce type serait possible dans une langue qui prend en charge un système de fichiers.
Non, parce que Java implémente réentrance. Mais s'il vous plaît ne pas confondre la simultanéité et RMI comme ça. Synchronisation dans les bouchons est quelque chose de complètement différent que les objets qui sont à l'interne synchronisée.
Vous pouvez obtenir vous-même dans un thread unique de Blocage avec ReentrantReadWriteLock. Des verrous en écriture peuvent acquérir des verrous en lecture, mais pas l'inverse. Le suivant va bloquer indéfiniment.
Idéalement un thread ne doit jamais créer un blocage lui-même à l'aide de " synchronisé de serrures, sauf si il y a vraiment un bug dans la JVM elle-même comme prétendument ' remarqué par certaines personnes dans les anciennes versions
Ici un moyen pour un thread de blocage lui-même.
Le thread crée une instance d'une classe - toute la classe et il attend d'elle. Parce que le thread créé un objet avec une portée locale, il n'y a aucun moyen possible pour n'importe quel autre thread pour notifier l'objet de réveiller le fil.
Vous écrivez un fil qui permet de recevoir des messages provenant d'autres threads en disant qu'il, par exemple, mettre fin. Vous écrivez du code dans le thread pour surveiller les autres threads et de les envoyer à mettre fin à des messages et à attendre une réponse. Le thread de se retrouver dans la liste, envoyer un message à résilier et d'attendre pour lui-même de mettre fin. Si il n'était pas écrit de manière prioritaire les messages entrants sur l'état d'attente ...
Si vous tirez sur la définition de la durée de blocage: un seul thread peut se trouver bloqué sur un non réentrant de verrouillage qu'il avait pris plus tôt.
Lorsqu'un thread entre dans le bloc synchronisé, il vérifie si le thread courant est le propriétaire de la serrure, et si elle l'est, le fil juste un produit sans attendre.
Donc je ne pense pas que c'est possible.
Je sais que c'est un vieux post. Voici un autre exemple de la façon dont cela pourrait se produire si votre code a l'interaction avec les ressources externes:
J'ai un fil, que d'ouvrir une connexion de base de données, démarrer une transactionA, et de commencer à mettre à jour. Le même thread, ouvrir une autre connexion, commencer un autre transactionB. Cependant, parce que transactionA n'a pas commis, et il a table de base de données verrouillée, transactionB qui se passe pour accéder à cette table verrouillée, donc il doit attendre
En fin de compte le même thread est bloquer par lui-même, car elle a ouvert plus d'une connexion de base de données.
Ce qui s'est passé beaucoup de choses dans l'application que j'ai de travailler avec, car il existe de nombreux modules de l'application, et un thread peut s'exécuter même si de nombreuses méthodes. Ces méthodes s'ouvre leurs propres connexions. Depuis nous avons eu différents développeurs d'écrire leur code, ils ne peuvent pas voir la façon dont leur code commencent appelé, et ne pouvait donc pas voir l'ensemble des transactions de base de données ouvert par l'application.
L'intervieweur a droit. Un thread peut se bloquer lui-même selon JCIP. Mais comment?
Dans la section 2.3.2 du JCIP nous avons le paragraphe suivant sur la Réentrée:
Synchronisée mot clé de verrouillage est réentrante de verrouillage de sorte qu'un thread peut verrouiller et déverrouiller imbriqués, mais si vous utilisez un non réentrant de verrouillage, comme l'exemple suivant, j'ai écrit comme une preuve. Vous aurez une impasse! Selon JCIP.
Bien que les commentaires ici sont d'être pointilleux à propos de "blocage" qui se passe si au moins deux threads/actions sont en compétition pour la même ressource...je pense que l'esprit de cette question était de discuter de la nécessité pour Réentrant lock - en particulier dans le contexte de "récursive" verrouillage
Voici un exemple en python (je suis certain que le concept reste le même en Java):
Si vous modifiez le RLock de Verrouillage (c'est à dire réentrant de verrouillage pour verrouiller, le thread se bloque)