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 :

Acces "concurrents" à une methode


Sujet :

Java

  1. #1
    Membre actif Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Points : 240
    Points
    240
    Par défaut Acces "concurrents" à une methode
    Salut,

    Qu'est ce qui se passe quand plusieurs objets accèdent à une methode en meme temps (methode pas focement synchronisée dans le cas où elle ne modifie que des parametres locaux par exemple) ?
    Est ce que le bout de code est dupliqué et chaque appel à cette methode est finalement independant, où est ce que ça marche autrement ?

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Bonjour,

    Ça dépend ce que tu entends par "paramètre locaux".

    Chaque thread a sa propre pile (stack) dans laquelle sont conservées les variables locales et les résultats intermédiaires.
    Par contre le tas (heap) est partagé par tous les threads de la JVM et il contient tous les objets.

    Donc tant que tu manipules des types primitifs (ou des objets immutable comme String) en variables locales (ou paramètres) il n'y a pas de problème de synchro puisque tu es dans un espace propre au thread.
    En revanche si tu as une référence locale vers un objet (ou un tableau), cette référence est bien locale mais elle pointe vers un objet du tas qui lui est partagé alors il peut y avoir des problématiques d'accès concurrents sur les attributs de cet objet. Tous les attributs de la classe courante (this) rentrent dans cette catégorie puisqu'ils sont aussi dans le tas.

  3. #3
    Membre actif Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par -gma- Voir le message
    Ça dépend ce que tu entends par "paramètre locaux".
    Prenons l'exemple d'une methode qui fait l'addition de 2 entiers passés en parametres. J'ai plusieurs threads qui accedent simultanement à cette methode.

    Je manque de notions "bas niveau" donc la question est stupide, mais qu'est ce qui fait que ça ne crash pas. Est ce qu'il y a autant de "copies" de la methode qu'il y a d'appels à cette methode ?

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Dans ce cas la, tu n'utilise que des variables locales. Donc, comme précisé par gma, il n'y a pas de probleme puisque chaque thread va instancier les variables locales qu'il utilise.

    Le probleme se pose si tu utilises les variables de classe (this->???). Mais dans ton cas, non donc pas de probleme...

  5. #5
    Membre actif Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Points : 240
    Points
    240
    Par défaut
    Ok pour les variables. Mais où sont stockées les instructions de la methode ?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par rushtakn Voir le message
    Je manque de notions "bas niveau" donc la question est stupide, mais qu'est ce qui fait que ça ne crash pas. Est ce qu'il y a autant de "copies" de la methode qu'il y a d'appels à cette methode ?
    Parce que les choses ne crashent pas pour de vagues impressionz qu'un truc ne va pas. Les choses crashent quand quelque chose provoque ce crash. Et là, rien ne peut le provoquer.

    Il n'y a pas besoin de "copier la méthode." Le code d'une méthode est en lecture seule, pas moyen de le modifier pendant l'exécution. Donc tout le monde peut se le partager sans problème. Sur les OS modernes, c'est le cas de pratiquement tout ce qui est code exécutable.

    Les données manipulées par la méthode, ça c'est une autre histoire.
    Comme déjà dit, si ce sont des variables locales, elles sont stockées sur la pile et chaque thread a sa propre pile qu'il ne partage pas avec les autres, donc pas de problème.
    Si c'est autre chose, là, il peut en effet y avoir conflit dans l'ordre des lectures et écritures. Ça ne provoque pas forcément de crash, mais ça provoque des états incohérents des données manipulées, ce qui peut être très grave (et aussi, provoquer un crash, mais ça, c'est un moindre mal comparé à des résultats incorrects.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif Avatar de rushtakn
    Inscrit en
    Mai 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 213
    Points : 240
    Points
    240
    Par défaut
    merci je vois mieux.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ça ne provoque pas forcément de crash, mais ça provoque des états incohérents des données manipulées, ce qui peut être très grave (et aussi, provoquer un crash, mais ça, c'est un moindre mal comparé à des résultats incorrects.)
    Tout à fait, les problèmes de concurrence sont généralement intermittents ce qui les rend encore plus difficiles à résoudre, car plus difficiles à reproduire.

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

Discussions similaires

  1. passage d' l'index d'une boucle a une methode : banalisation de quote
    Par sallemel dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 23/01/2012, 12h03
  2. [DLL] Acces a une methode par son index de maniere dynamique
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 11/03/2005, 17h14

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