next up previous contents
suivant: Entrées/Sorties monter: wait, notify, notifyAll précédent: Producteurs/Consommateurs   Table des matières

Barrière de synchronisation

Dans cet exemple, on exécute les activités pas à pas en utilisant des barrières de synchronisation : pour passer d'un pas à un autre une activité doit attendre que toutes les autres activités aient terminé le pas précédent. On peut ainsi simuler dans un système asynchrone des calculs synchrones.

Une barrière est un compteur qui peut être incrémenté et décrémenté (de façon atomique), mais en restant toujours entre une valeur minimale (ici 0) et une valeur maximale valMax. Si l'opération d'incrémentation ou de décrémentation ne peut pas se faire sans violer cette condition, cette opération est bloquante.

Les pas synchrones sont simulés à l'aide de deux barrières ayant comme valeur maximale NMAX correspondant au nombre d'activités conderné par cette exécution pas à pas.



transparent
Barrières


public class Barriere{
    int valMax;
    int val=0;
    public Barriere(int valMax, int val){
        this.valMax=valMax; this.val=val;
    }
    synchronized public void inc() throws InterruptedException{
        val++;
        while(val < valMax){ wait(); }
        notifyAll();
    }
    synchronized public void dec()throws InterruptedException{
        val--;
        while(val > 0){  wait();}
        notifyAll();
    }
}


transparent
Barrières (suite)


import java.util.Random;
class Main{
    static int NMAX=10;
    public static void main(String[] args){
         Proc proc[]= new Proc[NMAX];
         Barriere b[]= {new Barriere(NMAX,0), 
                    new Barriere(NMAX,NMAX)};
         for(int i=0; i<NMAX;i++){
             proc[i]= new Proc(i,b).start();
         }
    }
}
class Proc extends Thread{
    Barriere b[];
    public Proc(int i,Barriere b[]){
        super("proc "+i); this.b=b;
    } // ...


transparent
Barrières (fin)


//...
    public void run(){
        int t; int i=0; Random rand = new Random();
        while (true){
            t=Math.abs(rand.nextInt()%5000);
            try{sleep(t);} catch (InterruptedException e){}
            switch (i){
            case 0: b[0].inc();
            case 1: b[1].dec();
            case 2: b[0].inc();
            case 3: b[1].inc();
            }
            System.out.println(getName()+" fin du step "+i);    
            i = (i+1)%4;
        }
    }
}



next up previous contents
suivant: Entrées/Sorties monter: wait, notify, notifyAll précédent: Producteurs/Consommateurs   Table des matières
Hugues Fauconnier 2002-01-11