Synchroniser « à l'utilisation » pour le problème de compte en banque                  

Synchroniser « à l'utilisation » pour le problème de compte en banque

     

Le code est encore quasiment identique au code non synchronisé que vous avez peut-être déjà observé sauf que, avant de faire une opération bancaire sur le compte (ici, ces opérations sont représentées par la méthode credite), il faut obtenir un verrou sur le compte.

Ce procédé a déjà été employé, mais d'une façon un peu différente dans notre exemple précédent. Dans l'exemple précédent, la méthode credite gère directement le verrou, ce qui fait que l'on peut utiliser celle-ci en toute sécurité. Ici, on suppose que la méthode credite est déjà définie, et n'a pas prévu de synchronisation. On met alors au point une synchronisation au moment de l'utilisation de la méthode credite ; on pose un verrou sur l'instance de Compte traitée ; le déroulement est alors identique à celui de l'exemple précédent.

Voici le programme et ce qu'on obtient. Les classes Banquier et Compte sont celles définies précédemment.

class Banquier2 extends Banquier
{
    Banquier2(Compte unCompte, String nom)
    {
      super(unCompte, nom);
    }

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

}

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

      (Jean = new Banquier2(unCompte, "Jean")).start();
      (Jacques = new Banquier2(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
Jean continue son travail
Jacques commence son travail
Jacques continue son travail
Votre capital est de 2

Ici, vous pouvez répérer le programme.




© Irène Charon, Télécom ParisTech 2011