Compréhension des Threads en Java [Résolu]

Signaler
Messages postés
5
Date d'inscription
vendredi 21 août 2020
Statut
Membre
Dernière intervention
28 avril 2021
-
Messages postés
5
Date d'inscription
vendredi 21 août 2020
Statut
Membre
Dernière intervention
28 avril 2021
-
Bonjour,

voilà en fait j'aimerais qu'on puisse m'expliquer une chose.

J'ai lancé un petit programme permettant d'ajouter ainsi que de retirer l'argent dans un Thread. Il ajoutera 200 et retirera 200 également. Donc il devra à la fin faire 0.

Je vous présente ici mes bouts de codes :


-LA CLASSE COMPTE-


public class Compte {

int somme = 0;

public synchronized void deposerArgent(int somme) {
this.somme += somme;
}

public synchronized void retirerArgent(int somme) {

this.somme -= somme;

}

public int getSomme(){
return somme;
}
}



-LA CLASSE OPERATION-


public class Operation extends Thread {

Compte compte;

public Operation(Compte compte) {
this.compte = compte;
}

@Override
public void run(){
while(true) {
compte.deposerArgent(200);
compte.retirerArgent(200);
System.out.println(this.getName() + " : " + compte.getSomme());
try {
sleep(3500);
} catch (InterruptedException e) {
System.out.println("Exception "+e);
}
}
}
}



-LA CLASSE MAIN-


public class Main {

public static void main(String[] args) {
final int MAXTHREADS = 20;
Operation operations[] = new Operation[20];
Compte compte = new Compte();

for(int i = 0; i < MAXTHREADS; ++i) {
operations[i] = new Operation(compte);
operations[i].setName("Operation "+i);
operations[i].start();
}
}
}



-RESULTAT-

Operation 12 : 0
Operation 19 : 0
Operation 1 : 0
Operation 16 : 200
Operation 7 : 0
Operation 5 : 0
Operation 17 : 200
Operation 6 : 0
Operation 2 : 200
Operation 4 : 0
Operation 13 : 0
Operation 3 : 0
...

Comment se fait il que à certains moments je me retrouve avec 200 ou plus ? Alors que la méthode est en synchronised ?

Merci d'avance si une âme charitable puisse m'aider,

-QPPJabYou-

2 réponses

Messages postés
16336
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2021
2 829
Bonjour,

Pour résumer, tu as des threads qui font :
compte.deposerArgent(200);
compte.retirerArgent(200);
System.out.println(getName() + " : " + compte.getSomme());


Voici un exemple d'exécution possible. Au départ, le compte est à 0 et on considère trois threads A, B et C. Avec en gras, les getSomme que tu affiches.

Thread A: deposerArgent => 200
Thread B: deposerArgent => 400
Thread C: deposerArgent => 600
Thread A: retirerArgent => 400
Thread A: getSomme => 400
Thread B: retirerArgent => 200
Thread B: getSomme => 200
Thread C: retirerArgent => 0
Thread C: getSomme => 0

Tu vas donc afficher 400, 200 et 0. Ce qui est vrai au moment de l'affichage. Ce n'est pas forcément représentatif de l'ensemble des opérations effectuées, mais le principal est sauf : à la fin tu auras bien toujours 0.
Messages postés
5
Date d'inscription
vendredi 21 août 2020
Statut
Membre
Dernière intervention
28 avril 2021

Super j'ai compris, merci de m'avoir répondu :)