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

Langage Java Discussion :

c'est quoi la signification de « synchronized »


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 113
    Par défaut c'est quoi la signification de « synchronized »

    En fait j’ai une question banale pour les threads. C’est quoi la signification de « synchronized ». Est-ce qu’une méthode synchronized d’un class peut être exécuté seulement par un seul thread à la fois ? Dans ce cas à quoi ça sert « notifyall() » dans une méthode synchronisé si une seule méthode qui peut être déverrouiller (sachant quel a fait un « wait() » avant). Etc etc…

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    Le mieux c'est que t'ailles voir un tuto comme celui la :
    http://alwin.developpez.com/tutorial/JavaThread/
    ou celui la :
    http://viennet.developpez.com/cours/java/thread/

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 113
    Par défaut
    Est-ce que vous pouvez me donner ce que vous avez compris une méthode Synchronized (sans parler des wait). Et aussi sur comment ça marche le « notifyall ». Bien sur je vais voir les tutoriaux mais j’aime aussi avoir des repense à votre façon.
    Thanks.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par freakfm
    Est-ce que vous pouvez me donner ce que vous avez compris une méthode Synchronized (sans parler des wait). Et aussi sur comment ça marche le « notifyall ». Bien sur je vais voir les tutoriaux mais j’aime aussi avoir des repense à votre façon.
    Thanks.
    Étant donné que c'est moi qui ai écrit le tuto dont j'ai mis le lien, c'est une réponse à ma façon lol

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 113
    Par défaut
    Dans le tutorial vous avez dit:

    « Les problèmes d'accès concurrents se règlent en JAVA à l'aide du mot clé synchronized, qui permet de déclarer qu'une méthode ou un bloc d'instructions est critique : un seul thread á la fois peut se trouver dans une partie synchronisée sur un objet. »

    Donc je peut dire qu’une méthode ‘sychronized’ ne peut être exécuter que par un seul thread à la fois.

    Si non dans les trois tutoriaux il y a just un micro exemple qui explique le fonctionement de « notifyAll » il y a que du code sans explication
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //: Evenement.java
    // Classe simulant la notion d'événement
    //	S. Szulman 1998
    public class Evenement
    {
    	private Boolean Etat; // etat de l'evenement 
    	public Evenement() {
    		Etat = Boolean.FALSE;
    	}
    	public synchronized void set() {
    		Etat = Boolean.TRUE;
            // debloque les threads qui attendent cet evenement:
    		notifyAll(); 
    	}
    	public synchronized void reset() {
    		Etat = Boolean.FALSE;
    	}
    	public synchronized void attente() {
    		if(Etat==Boolean.FALSE) {
    			try {
    				wait(); // bloque jusqu'a un notify()
    			}
    			catch(InterruptedException e) {};
    		}
    	}// fin attente
    }// fin classe
    cela ne me permet pas de comprendre.
    En faite je vais expliquer dans le message suivant qu’est ce que j’ai pas compris

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 113
    Par défaut
    Ce que je comprend pas c’est si notifyall() dévérous tous les wait des method synchronized alors est ce que ça veut dire tous simplement que les wait sont annuler mais seulement un seul thread qui va marché et les autres vont attendre?. Je pense que ça marche comme ça non ?

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Le comportement de wait() et notify() est assez bien décrit dans la javadoc...

    Quand tu rentres dans un bloc synchronized, le thread courant prend un verrou qui empêche les autres threads de rentrer dans le bloc (ou tout autre bloc qui utiliserait le même verrou). Si un autre thread tente de récupérer le même verrou il sera mis en attente jusqu'à qu'il soit libre

    Et lorsque tu utilises wait(), ce verrou est libéré par le thread courant avant de rentrer en sommeil : donc d'autres threads peuvent éventuellement utiliser ce même verrou
    The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor
    Lorsque le thread est réveillé par un notify() ou notifyAll(), il doit reprendre le verrou à nouveau avant de pouvoir continuer. Donc les threads se réveilleront réellement les uns après les autres selon la libération du verrou...
    to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.
    a++

  9. #9
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 113
    Par défaut
    Donc si j’ai bien compris, il y a un seul verrou pour une méthode synchroniser d’un class, si on fait wait, on a plus le droit d’avoir le verrou, si on est réveillé par notify ou notifyall, on aura le droit au verrou mais on va attendre notre tour (dans le cas de notify ça va être notre tour, dans le cas de notifyall on va attendre notre tour qu’on peut dire aléatoire)

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par freakfm
    Donc si j’ai bien compris, il y a un seul verrou pour une méthode synchroniser d’un class,
    Le verrou correspond à la référence utilisé dans le bloc synchronized :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    synchronized (verrou) {
          ...
    }

    Sachant que pour lorsque synchronized est utilisé sur une méthode, le verrou utilisé est la référence de l'objet courant (this) ou l'instance de Class représentant l'objet pour les méthodes static, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MaClasse {
    	public synchronized void method() {
    		// ...
    	}
     
    	public static synchronized void staticMethod() {
    		// ...
    	}
    }
    Est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MaClasse {
    	public void method() {
    		synchronized(this) {
    			// ...
    		}
    	}
     
    	public static void staticMethod() {
    		synchronized(MaClasse.class) {
    			// ...
    		}
    	}
    }


    Citation Envoyé par freakfm
    si on fait wait, on a plus le droit d’avoir le verrou, si on est réveillé par notify ou notifyall, on aura le droit au verrou mais on va attendre notre tour (dans le cas de notify ça va être notre tour, dans le cas de notifyall on va attendre notre tour qu’on peut dire aléatoire)
    Oui grosso modo c'est ca

    a++

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 113
    Par défaut
    Citation Envoyé par adiGuba
    Oui grosso modo c'est ca
    OK, thanks

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

Discussions similaires

  1. [AC-2003] c'est quoi la signification de ce message d'erreur?
    Par NANOUSUN dans le forum IHM
    Réponses: 6
    Dernier message: 02/03/2010, 14h06
  2. [sbadecoder a dit].. C'est quoi pour vous un beau programme?
    Par seb.49 dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 13/02/2004, 10h41
  3. C'est quoi XMLRAD ?
    Par laffreuxthomas dans le forum XMLRAD
    Réponses: 10
    Dernier message: 09/08/2003, 02h42
  4. C'est quoi "Profile" dans le assign du XMLGram ?
    Par Lux interior dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/02/2003, 11h37
  5. C'est quoi exactement un générateur d'états
    Par Henry Cesbron Lavau dans le forum Outils de restitution et d'analyse
    Réponses: 0
    Dernier message: 02/04/2002, 19h15

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