62 votes

Est-il possible pour un thread de Blocage lui-même?

Est-il techniquement possible pour un thread en Java à l'impasse?

On 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 de réaliser 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            
    }
}

53voto

Justin Points 42106

Eh bien, basé sur la définition de:

Un blocage est une situation dans laquelle deux ou plusieurs actions concurrentes attendent que l'autre à la fin.

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 les 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 pour quelque chose de se produire, où, en fait, que quelque chose doit être traité par un autre message sur le message de la pompe.

Ce (incroyablement fictive) scénario peut éventuellement être techniquement appelé un blocage.

20voto

Jon Skeet Points 692016

Cela dépend de ce que tu veux dire par "blocage" exactement. Par exemple, vous pourriez aisément 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.

11voto

Alexander Pogrebnyak Points 24964

Peut-être qu'il voulait dire de VERROUILLAGE lui-même, qui est certainement trop facile:

synchronized( this )
{
    wait( );
}

8voto

finnw Points 24592

Peut-être ce que l'intervieweur a penser a:

Thread.currentThread().join();

Cependant, je dirais que ça ne compte pas comme un blocage.

6voto

sjlee Points 3457

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X