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
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(); } }
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; } // ...
//... 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; } } }