Bonsoir
j'ai commencé c'est derniers jour a apprendre les threads dans java, et j'ai fait un petit exemple pour mieux comprendre synchronized, mais hélas ce dernier ne marche pas:
lorsque j'execute le code, la méthode Retrait de Tirez n'est pas atomique malgré que j'ai ajouté le mot clé synchronized devant la méthode, elle ne s'execute pas comme une seul instruction, d'ou peut venir le problème?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 class CompteBancaire { private int balance = 50; public int getSolde() { return balance; } public void retrait(int montant) { balance = balance - montant; } } class Tirez implements Runnable{ private CompteBancaire account; Tirez(Account a) { account = a; } private synchronized void Retrait(int montant) { if(account.getSolde() >= montant) { System.out.println(Thread.currentThread().getName() + " a verifié qu'il y'a du solde dans le compte"); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } account.retrait(montant); System.out.println(Thread.currentThread().getName() + " a tiré la somme de " + montant); System.out.println("Le compte contient " + account.getSolde()); } else System.out.println(Thread.currentThread().getName() + " Le compte ne contient pas assez "); } public void run() { for(int i=0; i<5 ;i++) { this.Retrait(10); } } } //La méhode Main public class a { public static void main(String[] arg) { Account monCompte = new Account(); Tirez tirez1 = new Tirez(monCompte); Tirez tirez2 = new Tirez(monCompte); Thread t1 = new Thread(tirez1,"reda"); Thread t2 = new Thread(tirez2,"elle"); t1.start(); t2.start(); } }
Merci d'avance
Partager