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 :

Java mot clé synchronized


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 7
    Points : 12
    Points
    12
    Par défaut Java mot clé synchronized
    Bonjour,

    Je suis occupé à faire des tests sur le mot clé synchronized.

    Le mot clé synchronized, si j'ai bien compris, permet de s'assurer qu'un seul thread à la fois n'exécute du code se trouvant dans un bloc synchronized ou dans une méthode synchronized.

    Je dispose d'un exemple et suite à des éxécutions successives du même code, les résultats obtenus sont différents.

    La classe implementant Runnable :
    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
     
    public class Task implements Runnable {
     
    	private Counter counter;
     
    	public Task(Counter counter) {		
    		this.counter = counter;
    	}
     
    	@Override
    	public void run() {
    		for (Long i = 0L; i < 5; i++) {						
     
    				synchronized (counter) {
    					counter.add(i);				
    				}			
    		}
    	}
     
    }
    La classe bean :

    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 Counter {
    	private Long count = 0L;
    	private Long secondCount = 0L;
     
    	public void add(Long value){		 
    			count += value;
    			System.out.println("The value of count is : " + count + " on " + Thread.currentThread().getName());				
    	}
     
     
     
    }

    La classe de test:
    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 Test {
    	public static void main(String args[]) {
     
    		Counter counter = new Counter();
     
    		Task threadA = new Task(counter);
    		Task threadB = new Task(counter);
     
    		new Thread(threadA).start();
    		new Thread(threadB).start();
    	}
    }

    Les résultats sont aléatoires, alors que les 2 threads devraient s'éxécuter les un après les autres.

    Résultat 1:

    The value of count is : 0 on Thread-0
    The value of count is : 1 on Thread-0
    The value of count is : 3 on Thread-0
    The value of count is : 3 on Thread-1
    The value of count is : 4 on Thread-1
    The value of count is : 6 on Thread-1
    The value of count is : 9 on Thread-1
    The value of count is : 13 on Thread-1
    The value of count is : 16 on Thread-0
    The value of count is : 20 on Thread-0

    Résulat 2 : (résultat désiré)

    The value of count is : 0 on Thread-0
    The value of count is : 1 on Thread-0
    The value of count is : 3 on Thread-0
    The value of count is : 6 on Thread-0
    The value of count is : 10 on Thread-0
    The value of count is : 10 on Thread-1
    The value of count is : 11 on Thread-1
    The value of count is : 13 on Thread-1
    The value of count is : 16 on Thread-1
    The value of count is : 20 on Thread-1

    Merci d'avance pour vos réponses.

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je ne vois pas ce qui te pose problème !

    Quand tu utilises synchronized, tu places un lock sur l'objet ... Mais étant donné que tu le fais au sein d'une boucle, tout ce que tu garantis avec ton code c'est qu'il n'y aura pas deux exécutions simultanées de add sur ton counter. L'ordre d'exécution des threads n'est en rien déterminé. Il pourrait l'être si tu synchronisais sur ton counter avant d'entrer dans la boucle : le 1er thread prendrait le lock, et du coup le 2nd thread serait forcé d'attendre que le 1er en ait fini.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Les résultats sont aléatoires, alors que les 2 threads devraient s'éxécuter les un après les autres.
    Non, tes deux threads vont s'exécuter en parallèle.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Si la liste est la bonne, il y a quand même un problème, on retrouve 2x la valeur 3 sur 2 thread
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    C'est parce que la variable de boucle i est initialisée à 0, donc le 1er passage par add dans un Thread garde la valeur constante.

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

Discussions similaires

  1. mot clé synchronized
    Par cycloop dans le forum Général Java
    Réponses: 3
    Dernier message: 02/04/2012, 11h38
  2. Mot clé "Synchronized"
    Par wariom dans le forum Langage
    Réponses: 5
    Dernier message: 11/07/2008, 16h31
  3. Passage de C++ à Java (mot clef extern)
    Par grodwar dans le forum Langage
    Réponses: 5
    Dernier message: 05/05/2007, 13h06
  4. JAVA mot de passe
    Par ulysse031 dans le forum AWT/Swing
    Réponses: 27
    Dernier message: 27/03/2007, 16h20
  5. java, mots réservés.
    Par Empty_body dans le forum JDBC
    Réponses: 3
    Dernier message: 15/12/2006, 16h39

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