code: // from gee.cs.oswego.edu/home/jsr166/jsr166
  
  package jsr166tests.loops;
  
  
  /*
   * Written by Doug Lea with assistance from members of JCP JSR-166
   * Expert Group and released to the public domain, as explained at
   * http://creativecommons.org/licenses/publicdomain
   */
  
  // Stand-alone version of java.util.Collections.synchronizedCollection
  import java.util.*;
  import java.io.*;
  
  public final class SynchronizedCollection<E> implements Collection<E>, Serializable {
      final Collection<E> c;	   // Backing Collection
      final Object	   mutex;  // Object on which to synchronize
  
      public SynchronizedCollection(Collection<E> c) {
          if (c==null)
              throw new NullPointerException();
          this.c = c;
          mutex = this;
      }
      public SynchronizedCollection(Collection<E> c, Object mutex) {
          this.c = c;
          this.mutex = mutex;
      }
  
      public SynchronizedCollection() {
          this(new ArrayList<E>());
      }
  
      public final int size() {
          synchronized(mutex) {return c.size();}
      }
      public final boolean isEmpty() {
          synchronized(mutex) {return c.isEmpty();}
      }
      public final boolean contains(Object o) {
          synchronized(mutex) {return c.contains(o);}
      }
      public final Object[] toArray() {
          synchronized(mutex) {return c.toArray();}
      }
      public final <T> T[] toArray(T[] a) {
          synchronized(mutex) {return c.toArray(a);}
      }
  
      public final Iterator<E> iterator() {
          return c.iterator();
      }
  
      public final boolean add(E e) {
          synchronized(mutex) {return c.add(e);}
      }
      public final boolean remove(Object o) {
          synchronized(mutex) {return c.remove(o);}
      }
  
      public final boolean containsAll(Collection<?> coll) {
          synchronized(mutex) {return c.containsAll(coll);}
      }
      public final boolean addAll(Collection<? extends E> coll) {
          synchronized(mutex) {return c.addAll(coll);}
      }
      public final boolean removeAll(Collection<?> coll) {
          synchronized(mutex) {return c.removeAll(coll);}
      }
      public final boolean retainAll(Collection<?> coll) {
          synchronized(mutex) {return c.retainAll(coll);}
      }
      public final void clear() {
          synchronized(mutex) {c.clear();}
      }
      public final String toString() {
          synchronized(mutex) {return c.toString();}
      }
      private void writeObject(ObjectOutputStream s) throws IOException {
          synchronized(mutex) {s.defaultWriteObject();}
      }
  }
  