SemaMultiple.java

package fr.umlv.ji.tcp.server;
/**
 * Classe représentant des sémaphores généralisés, pouvant être
 * initialisés à un entier positif quelconque et représentant des
 * compteurs protégés des accès concurrents.
 */
public class SemaMultiple {
  private int value;
  private int max;
  /** Constructeur du sémaphore initialisé à max. */
  public SemaMultiple(int max) {
    this.max = max;
    value = max;
  }
  /** Méthode permettant de décrémenter le compteur.
      Si le compteur est déjà à 0, la méthode est bloquante. */
  public synchronized void P() throws InterruptedException {
    while (value == 0)
      wait();
    value--;
  }
  /** Méthode permettant d'incrémenter le compteur. Si le compteur
      est déjà à max, la méthode est sans effet sur le compteur. */
  public synchronized void V() {
    if (value < max)
      value++;
    notify();
  }
}