Bonjour,
J'ai ce code source (Main.java):
Est-ce que le résultat sera toujours 4.0 ?
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 class MyThread extends Thread { private Main main; public MyThread(Main main){ this.main = main; } public void run() { main.addOne(); main.addOne(); } } public class Main{ public double a = 0.0; public synchronized void addOne(){ a += 1.0f; } public static void main(String []args){ Main main = new Main(); MyThread t1 = new MyThread(main); MyThread t2 = new MyThread(main); t1.start(); t2.start(); try{ t1.join(); t2.join(); }catch(InterruptedException e){}; System.out.println("A value:" + main.a); } }
J'ai mis le mot clef 'synchronized' et donc je suis sûr que l'opération d'ajout sera faite de façon atomique.
Par contre, je n'ai pas mis le mot clef 'volatile' sur la variable 'a'. Donc, si j'ai bien compris la variable 'a' pourrait se retrouver déjà incrémenté de 1.0 dans le cache CPU de la thread 1 tandis que la thread 2 va incrémenter 'a' en se basant sur sa valeur se trouvant en RAM. Du coup, je pourrais avoir en sortie 3.0 ?
Merci d'avance.
Partager