Compréhension des Threads en Java

Résolu/Fermé
QPPJabYou Messages postés 5 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 28 avril 2021 - 7 mars 2021 à 12:05
QPPJabYou Messages postés 5 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 28 avril 2021 - 18 mars 2021 à 20:07
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-
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 7 mars 2021 à 16:02
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.
0
QPPJabYou Messages postés 5 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 28 avril 2021
18 mars 2021 à 20:07
Super j'ai compris, merci de m'avoir répondu :)
0