Salve sto cercando di svolgere un esercizio per l'UNI in cui mi si chiede di sincronizare più thread in modo che si verifichi una predefinita sequenza di essi.

Di seguito le classi create da me:

do per scontato che chi aiuterà conosca cosa fanno le classi SemaforoBinario e SemaforoContatore:

SYNCH:
codice:
public class SynchSem{ // usato per sincronizzare i thread

    private SemaforoBinario mutexA = new SemaforoBinario(1);
    private SemaforoBinario mutexB = new SemaforoBinario(1);
    private SemaforoCont sA = new SemaforoCont(0);
    private SemaforoCont sB = new SemaforoCont(0);

    @Override
    public void passaA(){
         
        sA.P();
        System.out.println("Sezione critica "+Thread.currentThread().toString());
        sB.V();
        
    }

    @Override
    public void passaB() {
           
          mutexB.P();
           
               sA.V();
               sB.P();
               System.out.println("Sezione critica "+Thread.currentThread().toString());
               sA.V();
               sB.P();
               sA.V();
               sB.P(); 
               sB.V();
               
           mutexB.V();
    }

}
A (B uguale ad A):
codice:
public class A extends Thread{
    
     private Synch s;
     private int id;
     
     public A(int ID, Synch S ){ 
         super(""+ID); 
         s=S;
         id=ID;    
     }
     
     @Override
     public void run(){
         
         delay(1000,6000);
         s.passaA();
        
     }
     
     @Override
     public String toString(){ return "A#"+id; }
     
     private void delay(int min, int max){ // lo uso per avere tutti i thread a start nel main
          try{
              sleep( Math.round(Math.random()*(max-min))+min );
          }catch(InterruptedException exc){}
     }
     
     
}
MAIN:
codice:
public static void main(String[] args) {
        
        Synch s = new SynchSem();
        A a1 = new A(1,s);
        A a2 = new A(2,s);
        A a3 = new A(3,s);
        B b1 = new B(1,s); 
        B b2 = new B(2,s);
        
        a1.start();
        a2.start();
        a3.start();
        b1.start();
        b2.start();
}
La sequenza dovrebbe essere ABAAB, fino a ABA tt ok....
poi non va più, alle volte arriva anche a stampare ABAA, ma l'ultima B proprio mai.
Help me, please!