DynamicArray.java

public class DynamicArray {
  // La référence à l'objet de stockage
  private Object[] array;
  // L'incrément d'augmentation de la taille du tableau
  final static int INCR = 10;
  /** Crée un tableau dynamique de capacité initiale donnée.  */
  public DynamicArray(int initialCapacity) {
    array = new Object[initialCapacity]; 
  }
  /** Retourne la taille actuelle du tableau dynamique. */
  public synchronized int size() { return array.length; }
  /** Place l'élément o à l'indice i du tableau dynamique. Si i est
      plus grand que la taille du tableau, un nouveau tableau de taille
      i+INCR est alloué, les valeurs y sont recopiées et ce tableau
      remplace le précédent. */
  public void set(int i, Object o) {
    // Ne dépend pas du tableau et n'a pas besoin d'être synchronisé
    if (i < 0) throw new IndexOutOfBoundsException();
    // Exclusion des autres processus légers accédant à cet objet
    synchronized (this) { 
      if (i >= size()) {
    // Réallocation du tableau et recopie des valeurs
        Object[] tmp = array;
        array = new Object[i+INCR];
        System.arraycopy(tmp,0,array,0,tmp.length);
      }
      // Mise en place de o à l'indice i
      array[i] = o;
    }
  }
  /** Retourne l'élément à la position i du tableau dynamique. Pour
      lire un élément de manière sûre, il faut exclure l'accès des
      autres processus légers à l'objet pendant la lecture. */
  public synchronized Object get(int i) {  return array[i]; }
}