Bonjour,
Je démarre en Java avec le bouquin de Claude Delannoy.
J'en suis à la synchronisation des Threads avec la pose de verrous par synchronized.
Et la ca dérape
Pour bien comprendre, je réalise un petit programme de test :
Le main crée 2 objets runnable, les instancie, et les démarre.
Chaque run a une boucle de 0 à 1000 et appelle une methode synchronized qui icrémente et lit un champs compteur static.
Toujours dans la boucle, chaque thread affiche sur la console le nom du thread et la valeur du compteur.
Arrivé à la fin le compteur ne contient pas 2000 (ie 2 fois les 1000 de chaque thread) mais un peu moins.
Comme si le verrou n'avait pas fonctionné.
J'ai tourné et retourné le pb et je n'ai trouvé qu'une seule solution qui fonctionne:
C'est que la méthode synchronisée qui incrémente le compteur soit déclarée static.
Comme je ne trouve nulle part dans les forums et dans les FAQs ce genre de solution,
je me demande si je ne me suis pas fourvoyé ailleurs
Avez vous une idée ?
Gérard
PS j'utilise le JSE 1.5.0_06-b05 avec Eclipse 3.2.0
sur une machine Windows XP processeur intel dual-core (est-ce que ca a une importance ?)
je vous joins le code:
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 class TestThread implements Runnable { public TestThread(String name ){ this.name = name; } synchronized static int incCompteur(){ return ++compteur; } private static Integer compteur = 0; private String name; public void run( ) { int c; for( int i = 0; i < 1000; i++ ){ c = incCompteur(); Thread.yield(); System.out.println( name + " : " + c); } System.out.println( name + " fin : " + compteur); } } public class TestThr4 { public static void main(String[] args) { TestThread tt1 = new TestThread("A"); TestThread tt2 = new TestThread("B"); Thread t1 = new Thread( tt1 ); Thread t2 = new Thread( tt2 ); t1.start(); t2.start(); } }
Partager