9

Concurrence et interférences

Le programme ThreadInterferenceTest démarre l'exécution en parallèle de deux Threads. Le premier, le Maker, incrémente une variable 1000000 de fois. Le second, le Taker, décrémente la même variable 1000000 de fois aussi. À la fin, le programme affiche la valeur de la variable.

  1. public class ThreadInterferenceTest {
  2.     static final private int NCALLS = 1000000;
  3.  
  4.     private int counter = 0;
  5.  
  6.     private Thread maker, taker;
  7.  
  8.     public ThreadInterferenceTest() {
  9.         maker = new Thread(new Maker());
  10.         taker = new Thread(new Taker());
  11.     }
  12.  
  13.     public int getCounter() {
  14.         return counter;
  15.     }
  16.  
  17.     // MUST be synchonized
  18.     public void inc() {
  19.         counter++;
  20.     }
  21.  
  22.     // MUST be synchonized
  23.     public void dec() {
  24.         counter--;
  25.     }
  26.  
  27.     public void go() {
  28.         maker.start();
  29.         taker.start();
  30.         try {
  31.             maker.join();
  32.             taker.join();
  33.         }
  34.         catch (InterruptedException e) {
  35.         }
  36.     }
  37.  
  38.     private class Maker implements Runnable {
  39.         public void run() {
  40.             for (int i = 0; i < NCALLS; i++)
  41.                 inc();
  42.         }
  43.     }
  44.  
  45.     private class Taker implements Runnable {
  46.         public void run() {
  47.             for (int i = 0; i < NCALLS; i++)
  48.                 dec();
  49.         }
  50.     }
  51.  
  52.     public static void main(String args[]) {
  53.         ThreadInterferenceTest test = new ThreadInterferenceTest();
  54.         test.go();
  55.         System.out.println(test.getCounter());
  56.     }
  57. }
$ javac ThreadInterferenceTest.java
$ java ThreadInterferenceTest
-92387
$ java ThreadInterferenceTest
-784617

Au lieu d'obtenir la valeur attendue, 0, le compteur affiche une valeur aléatoire. NOTE : Si vous obtenez 0, relancez le programme. Si nécessaire, augmentez le nombre d'appels en changeant la valeur de la constante NCALLS.

Ajoutez le mot clé synchronized devant le type de donnée retourné par inc et dec, entre public et void, pour demander à Java de veiller à ce que l'exécution de ces méthodes ne soit par interrompue.

  1.     public synchronized void inc() {
  1.     public synchronized void dec() {
$ javac ThreadInterferenceTest.java
$ java ThreadInterferenceTest
0

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].