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 :

appel de méthode synchronized


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut appel de méthode synchronized
    Bonjour,

    j'ai une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public  synchronized void changeNote( int index, String note ) {
            bodyList.set( index, note );
        }
    j'ai lancer mon application web qui contient se code dans le serveur et j'ai ouvert deux navigateur j'ai connecter un utilisateur dans chaque navigateur et je fait appel dans chaque navigateur.

    normalement l'accès à cette méthode est exclusif ( si un utilisateur est entraint d'exécuter cette méthode l'autre ne peut l'exécuter que si le premier à fini ) ( si je comprend bien la notion de synchronized)

    dans mon cas j'ai lancer le serveur en mode debug j'ai mis un point d'arret sur la première instruction de cette méthode j'ai exécuter la méthode avec le premier utilisateur (donc le thread de cette utilisateur possède le verrou sur cette méthode), puis j'ai enlevé le point d'arret et j'ai lancé la méthode avec le second utilisateur " normalement il reste en attente d'exécuter cette méthode mais c'est pas le cas l'exécution continue normalement.

    est ce que ma comprérhension de la notion de synchronized est fausse?
    sinon comment assurer la synchronisation de la contention du cette méthode.

    merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Ta notion de ce qu'est une méthode synchronized est fausse

    Une méthode synchronized garanti simplement que quand on l'exécute sur un objet, aucune autre méthode synchronized ne pourra être utilisée *sur le même objet*. Le but étant de prévenir des accès concurrents sur un même objet, avec notamment des modifications sur l'état d'un objet qui feraient bugger une autre méthode (par exemple, sur une liste si tu retires des objets alors qu'une autre méthode est en train de la parcourir, tu peux prendre un risque de tomber sur un index hors limite).

    Par conséquent, si ta méthode s'applique sur des objets différents, ce n'est pas près de marcher ^^

  3. #3
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Ta notion de ce qu'est une méthode synchronized est fausse

    Une méthode synchronized garanti simplement que quand on l'exécute sur un objet, aucune autre méthode synchronized ne pourra être utilisée *sur le même objet*. Le but étant de prévenir des accès concurrents sur un même objet, avec notamment des modifications sur l'état d'un objet qui feraient bugger une autre méthode (par exemple, sur une liste si tu retires des objets alors qu'une autre méthode est en train de la parcourir, tu peux prendre un risque de tomber sur un index hors limite).

    Par conséquent, si ta méthode s'applique sur des objets différents, ce n'est pas près de marcher ^^
    merci pour la réponse.

    dans mons cas par exemple la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void deleteNote( int index ) {
     
            titleList.remove( index );
        	bodyList.remove( index );
        	}
        }
    est entrain d'etre exécuter par un autre utilisateur alors qu'un premier est entrain de modifier l'index j'aurais dans ce cas une erreur d'exécution alors que la méthode changenote est synchronized et utilise l'objet bodylist

    Comment je peut eviter ce confilit ?

    merci

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Sfaxiano Voir le message
    Comment je peut eviter ce confilit ?
    En utilisant synchronized et le même objet pour tous les utilisateurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Par défaut
    Citation Envoyé par thelvin Voir le message
    En utilisant synchronized et le même objet pour tous les utilisateurs.
    mon problème c que chaque utilisateur crée une instance de ces objets (j'ai vérifier cela avec le mode debug)

    est ce que l'utilisation static de ces objets peut résoudre le problème ?

    merci

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Les objets que créent les utilisateurs, s'ils en créent un chacun ou un pour tous, tout ça est censé être sous ton contrôle.

    C'est à toi de décider ce qui est commun à tous les utilisateurs et ce qui est créé pour chaque. Ton objectif est que des appels à une méthode soient fait en exclusion mutuelle. Le mot-clé synchronized est fait pour ça, mais il ne fait l'exclusion mutuelle que sur un objet, ou sur une classe pour les méthodes statiques.

    À partir de là, à toi de voir la solution qui s'adapte à ton problème. On ne va pas faire ton travail.

    Pour information, static peut plus ou moins aider au problème, mais on en conseille pas en général. Il vaut mieux créer un objet commun à tous les utilisateurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Thread] appel de méthodes non-synchronized dans une méthode synchronized
    Par dr23fr dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 24/06/2008, 22h47
  2. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  3. appel entre méthodes de meme classe
    Par frmaniako dans le forum C++
    Réponses: 8
    Dernier message: 10/09/2004, 22h55
  4. [Débutant] [JSP] Appel de méthode
    Par Crazyblinkgirl dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 10/09/2004, 11h10
  5. [Débutant] Héritage & appel de méthodes
    Par KooX dans le forum Langage
    Réponses: 4
    Dernier message: 11/05/2004, 23h37

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