RecListBis.java

public class RecListBis {
  private double value;
  private RecListBis next;
  // Déclaration d'une référence dont la seule utilité est de
  // représenter un moniteur commun pour tous les maillons de la liste
  private Object monitor;
  public RecListBis(double value, RecListBis next) {
    this.value = value;
    this.next = next;
    // Si aucun moniteur n'est associé à la liste, on crée une référence
    // sinon, on partage le même moniteur avec la sous-liste
    if (next==null) this.monitor = new Object();
    else this.monitor = next.monitor;
  }
  /** Ici, les méthodes n'ont plus besoin d'être synchronisées sur this,
      mais leur code doit être synchronisé sur le moniteur.  */
  public void setValue(double value) {
    synchronized (monitor) { this.value = value; }
  }
  public double getValue() {
    synchronized (monitor) { return value; }
  }
  public double sum() {
    synchronized (monitor) {
      // La synchronisation sur ce moniteur est conservée récursivement
      // jusqu'à la fin du calcul de la somme
      double sum = getValue();
      if (getNext()!=null)
    sum += getNext().sum();
      return sum;
    }
  }
  public boolean contains(double x) { 
    synchronized (monitor) { if (value==x) return true; }
    if (getNext()==null) return false;
    return getNext().contains(x);
  }
  /** La lecture d'une référence est réalisée atomiquement. */
  public RecListBis getNext() { return next; }
}