codice:
class Cliente extends Thread {
   Taxi risorsa;
   public Cliente(Taxi s) {
      risorsa = s;
   }

   public void run() {
      if(risorsa.risorsa == null) 
         try {
            wait();
         } catch(InterruptedException e) {}
      else
         risorsa.risorsa = null;
   }
}

class Taxi extends Thread {
   Object risorsa = null;
   public void run() {
      if(risorsa != null) 
         try {
            notify();
         } catch(InterruptedException e) {}
      else
         risorsa = "la mia risorsa";
   }
}

class Main {
   public static void main(String[] args){
      Cliente utonto1 = new Cliente();
      Cliente utonto2 = new Cliente();
      Taxi cinese = new Taxi();
      cinese.start();
      utonto1.start();
      utonto2.start();
   }
}
dopo tanta teoria è il primo programma che scrivo, non l'ho provato quindi non garantisco