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
   */
  
  // A set wrapper over CHM for testing
  
  import java.util.*;
  import java.util.concurrent.*;
  import java.io.*;
  
  public class ConcurrentHashSet<E> extends AbstractSet<E>
      implements Set<E>, Serializable {
  
      private final ConcurrentHashMap<E, Boolean> m;  // The backing map
      private transient Set<E> keySet;  // Its keySet
  
      public ConcurrentHashSet() {
          m = new ConcurrentHashMap<E, Boolean>();
          keySet = m.keySet();
      }
      public ConcurrentHashSet(int initialCapacity) {
          m = new ConcurrentHashMap<E, Boolean>(initialCapacity);
          keySet = m.keySet();
      }
      public ConcurrentHashSet(int initialCapacity, float loadFactor,
                               int concurrencyLevel) {
          m = new ConcurrentHashMap<E, Boolean>(initialCapacity, loadFactor,
                                                concurrencyLevel);
          keySet = m.keySet();
      }
  
      public int size()                 { return m.size(); }
      public boolean isEmpty()          { return m.isEmpty(); }
      public boolean contains(Object o) { return m.containsKey(o); }
      public Iterator<E> iterator()     { return keySet.iterator(); }
      public Object[] toArray()         { return keySet.toArray(); }
      public <T> T[] toArray(T[] a)     { return keySet.toArray(a); }
      public boolean add(E e) {
          return m.put(e, Boolean.TRUE) == null;
      }
      public boolean remove(Object o)   { return m.remove(o) != null; }
  
      public boolean removeAll(Collection<?> c) {
          return keySet.removeAll(c);
      }
      public boolean retainAll(Collection<?> c) {
          return keySet.retainAll(c);
      }
      public void clear()               { m.clear(); }
      public boolean equals(Object o)   { return keySet.equals(o); }
      public int hashCode()             { return keySet.hashCode(); }
  
      private static final long serialVersionUID = 2454657854757543876L;
  
      private void readObject(java.io.ObjectInputStream s)
          throws IOException, ClassNotFoundException
      {
          s.defaultReadObject();
          keySet = m.keySet();
      }
  }
  