IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Les Threads et la synchronisation


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Par défaut Les Threads et la synchronisation
    Je suis en train d'étudier la synchronisation et le verrou d'objet dans un bouquin quand tout à coup j'ai pensé à quelque chose qui n'était pas expliqué et vous pourrez peut-être m'aider à satisfaire ma curiosité :


    On sait qu'un Thread pose un verrou sur un objet lorsqu'il invoque une de ses méthodes synchronisée et les autres Threads doivent attendre que le verrou soit levé pour pouvoir accéder à cet objet.

    Maintenant imaginez que dans la méthode synchronisé invoqué soit invoqué une méthode synchronisée d'un autre objet ; bien entendu le Thread demande un verrou sur ce second objet.

    Cependant, si ce second objet est déjà verrouillé par un Thread qui attend la levée du verrou du premier objet, est-ce que les deux Threads vont se bloquer indéfiniment ou est-ce que la JVM a prévu ce cas de figure et qu'un mécanisme pour sortir de cette situation vaseuse existe ?

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Citation Envoyé par T`lash Voir le message
    ... ou est-ce que la JVM a prévu ce cas de figure et qu'un mécanisme pour sortir de cette situation vaseuse existe ?
    Cette situation "vaseuse", comme vous dites s'appelle un verrou mortel ou une étreinte fatale (" Deadlock " ou " Deadly embrace " en anglais). Elle est connue depuis fort longtemps (les années 60/70 en gros) dans le domaine des systèmes d'exploitation, des SGBD et des moniteurs transactionnels. La nombreuse littérature informatique consacrée à ces sujets décrit tous ces phénomènes et les solutions possibles qui, parfois, ne sont pas triviales.

    Je ne connais ni Java ni la JVM mais j'ose espérer que ce mécanisme propose effectivement une solution ...

  3. #3
    Membre expérimenté Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Par défaut
    Il s'agit en effet d'un probleme classique des systemes d'exploitation. Il existe deux approches pour le traiter, une dite pessimiste consiste a supposer que chaque demande d'une ressource risque de mettre le groupe des threads ou processus dans une situation d'interblocage; une algorithme specifique est executé (ecrit par Dijkstra) pour effectuer les vérifications necessaires; on cas de succès, la ressouce est allouée.

    l'autre approche, optimiste, consiste à allouer la ressource, puis en cas de probleme une procedure systeme de detection et guerison est executée et elle finit souvent par tuer un processus pour briser le cycle. elle est utilisée dans les systémes où les interblocages sont peu frequents.

    cela dit, pour les systemes, mais pour la JVM je n'ai pas grandes idées.

  4. #4
    Membre chevronné Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Par défaut
    Citation Envoyé par Amine_sas Voir le message
    Il s'agit en effet d'un probleme classique des systemes d'exploitation. Il existe deux approches pour le traiter, une dite pessimiste consiste a supposer que chaque demande d'une ressource risque de mettre le groupe des threads ou processus dans une situation d'interblocage; une algorithme specifique est executé (ecrit par Dijkstra) pour effectuer les vérifications necessaires; on cas de succès, la ressouce est allouée.

    [...]
    Cette première solution doit être très gourmande en ressources si des tests fréquents doivent être exécutés.
    C'est comme utiliser notifyAll plutôt que notify afin de ne pas laisser de Thread dans l'état bloqué, mais même si c'est plus contraignant pour ne pas oublier de Thread c'est moins gourmand d'utiliser notify que notifyAll et une batterie de tests.

  5. #5
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    LA JVM ne fera rien pour toi, tes deux threads seront en interblocages.
    Si un de ceux ci est l'EventDispachThread d'AWT alors ton application sera de plus freezé graphiquement.

  6. #6
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Cependant, si ce second objet est déjà verrouillé par un Thread qui attend la levée du verrou du premier objet, est-ce que les deux Threads vont se bloquer indéfiniment ou est-ce que la JVM a prévu ce cas de figure et qu'un mécanisme pour sortir de cette situation vaseuse existe ?
    L'interblocage est définitif. Il faut s'assurer qu'il n'arrivera jamais. D'ailleurs, un seul et même thread peut très bien se bloquer tout seul comme un grand : l'utilisation de verrous de type réentrant permet d'éviter ce type d'interblocage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Synchronisation entre les Thread
    Par Red Sno dans le forum C
    Réponses: 2
    Dernier message: 07/12/2012, 22h34
  2. Les Threads... J'en remet une couche :)
    Par Higestromm dans le forum C++
    Réponses: 5
    Dernier message: 17/11/2004, 12h19
  3. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25
  4. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo