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.
Ici, vous pouvez répérer l'exemple.
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
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