Un défaut de synchronisation                  

Un défaut de synchronisation

     

Observez le code ci-dessous. Il y figure :

Après le travail des banquiers, le capital n'est que de 1 : il y a eu un manque de synchronisation entre les banquiers. Successivement :

Le code pourrait être plus simple, mais a été conçu pour forcer l'absence de synchronisation.

class Compte
{
  int capital = 0;

  void credite(Banquier leBanquier, int deCombien)
    {
      int montant;

      System.out.println(leBanquier.nom + " commence son travail");
      montant = capital;
      leBanquier.yield();
      System.out.println(leBanquier.nom+" continue son travail");
      capital=montant+deCombien;
    }
}


class Banquier extends Thread
{
  Compte unCompte;
  String nom;

  Banquier(Compte unCompte, String nom)
    {
      this.unCompte=unCompte;
      this.nom = nom;
    }

  public void run()
    {
      System.out.println(nom+" est embauche");
      unCompte.credite(this,1);
    }
}

class EssaiBanquier
{
  public static void main(String[]Argv)
    {
      Compte unCompte = new Compte();
      Banquier Jean, Jacques;

      (Jean = new Banquier(unCompte, "Jean")).start();
      (Jacques = new Banquier(unCompte, "Jacques")).start();
      try
	{
	  Jean.join();
	  Jacques.join();
	}
      catch(InterruptedException e){}
      System.out.println("Votre capital est de " + unCompte.capital);
    }
}
On obtient :
Jean est embauche
Jean commence son travail
jacques est embauche
jacques commence son travail
Jean continue son travail
jacques continue son travail
Votre capital est de 1

Ici, vous pouvez répérer l'exemple.


leBanquier.yield(); : la méthode yield de la classe Thread conduit leBanquier a faire une pause en laissant un autre thread s'exécuter. Cette instruction nous sert ici à forcer le manque de synchronisation.
© Irène Charon, Télécom ParisTech 2011