Roco | Le but de ma démarche est de démontrer que si je ne verouille pas certains objets et que ceux-ci sont lu et modifié par différents processus, au bout, d'un certain temps, ces objets deviendront corrompus.
Mon exemple est celui d'un système bancaire avec un agent qui passe des transactions dans différentes banques sur différents comptes clients. Il fait des virement (débit + crédit).
Problème n°1 (technique) : je n'arrive pas à lancer les processus en parallèles. Malgré l'insertion de sleep et de yeild dans les threads, ceux-ci se déroulent séquentiellement...
Problème n°2 (conception): Je ne pense pas que ma modélisation soit correcte pour démontrer mon objectif. Et je crois que je devrais gérer cela un niveau plus bas (un objet en-dessous).
Voici la classe principale :
Code :
- public class Main {
- public static void main(String[] args) {
- Compte compteCh = new Compte(1000);
- Compte compteCj = new Compte(1000);
- Client clientCh = new Client("ch", compteCh);
- Client clientCj = new Client("cj", compteCj);
- Banque banqueBk = new Banque();
- banqueBk.ajouterClient(clientCh);
- Banque banqueBl = new Banque();
- banqueBl.ajouterClient(clientCj);
- Agent a1 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 1);
- Agent a2 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 2);
- Agent a3 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 3);
- Agent a4 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 4);
- Agent a5 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 5);
- Agent a6 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 6);
- Agent a7 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 7);
- Agent a8 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 8);
- Agent a9 = new Agent(banqueBk, banqueBl, clientCh, clientCj, 9);
- a1.run();
- a2.run();
- a3.run();
- a4.run();
- a5.run();
- a6.run();
- a7.run();
- a8.run();
- a9.run();
- System.out.println(" Solde du client ch : " + compteCh.getSolde());
- System.out.println(" Solde du client cj : " + compteCj.getSolde());
- }
- }
|
Voici la classe Agent :
Code :
- public class Agent implements Runnable {
- int numero;
- Banque b1;
- Banque b2;
- Client c1;
- Client c2;
- public Agent(Banque b1, Banque b2, Client c1, Client c2, int numero) {
- this.numero = numero;
- this.b1 = b1;
- this.b2 = b2;
- this.c1 = c1;
- this.c2 = c2;
- }
- public void passerTransaction(Client c1, Client c2, Banque b1, Banque b2, double somme) {
- b1.debiterClient(c1, somme);
- b2.crediterClient(c2, somme);
- System.out.println("Transaction effectuee sur le client " + c1.getNom() + " par la processus " + numero);
- }
- public void run() {
- passerTransaction(c1, c2, b1, b2, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- Thread.yield();
- passerTransaction(c2, c1, b2, b1, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- Thread.yield();
- passerTransaction(c1, c2, b1, b2, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- Thread.yield();
- passerTransaction(c2, c1, b2, b1, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- passerTransaction(c1, c2, b1, b2, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- passerTransaction(c2, c1, b2, b1, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- passerTransaction(c1, c2, b1, b2, 500);
- try {
- Thread.sleep((int)(Math.random()*1000));
- }
- catch (InterruptedException e) {}
- passerTransaction(c2, c1, b2, b1, 500);
- }
- }
|
Voici la classe Banque :
Code :
- import java.util.*;
- public class Banque implements Runnable {
- Vector lesClient;
- public Banque() {
- lesClient = new Vector();
- }
- public void run() {
- while (true) {
- }
- }
- public void ajouterClient(Client client) {
- lesClient.add(client);
- }
- public Client rechercheClient(Client client) {
- Client clientRenvoye = null;
- Enumeration en = lesClient.elements();
- while (en.hasMoreElements()) {
- Client clientTampon = (Client) en.nextElement();
- if (clientTampon.getNom() == client.getNom()) {
- clientRenvoye = clientTampon;
- }
- }
- return clientRenvoye;
- }
- public void crediterClient(Client client, double somme) {
- Client c = rechercheClient(client);
- double soldeAnterieur = c.getCompte().getSolde();
- double soldePosterieur = soldeAnterieur + somme;
- c.getCompte().setSolde(soldePosterieur);
- }
- public void debiterClient(Client client, double somme) {
- Client c = rechercheClient(client);
- double soldeAnterieur = c.getCompte().getSolde();
- double soldePosterieur = soldeAnterieur - somme;
- c.getCompte().setSolde(soldePosterieur);
- }
- }
|
Voici la classe Client :
Code :
- public class Client {
- String nom;
- Compte compte;
- public Client(String nom, Compte compte) {
- this.nom = nom;
- this.compte = compte;
- }
- public String getNom() {
- return nom;
- }
- public void setNom(String nom) {
- this.nom = nom;
- }
- public Compte getCompte() {
- return compte;
- }
- public void setCompte(Compte compte) {
- this.compte = compte;
- }
- }
|
Et enfin, voici la classe Compte :
Code :
- public class Compte {
- double solde;
- public Compte(double solde) {
- this.solde = solde;
- }
- public double getSolde() {
- return solde;
- }
- public void setSolde(double solde) {
- this.solde = solde;
- }
- }
|
Mon but final est d'appliquer des verrous exlusifs sur le comptes et des verrous partagés sur les banques.
Mais d'abord, je voudrais voir l'erreur tourner, sinon je ne pourrais jamais prendre réellement conscience du problème.
Merci d'avance  Message édité par Roco le 20-11-2003 à 16:04:14
|