Current set : Collections Threads « Threads « Java






Current set

   

/*
 * Copyright Ben Meadowcroft 2006
 * Version: $Revision: 1.1 $
 * Date:    $Date: 2006/02/24 22:24:46 $
 */
//com.agnotion.util.concurrent;

import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Ben Meadowcroft
 */
public class ConcurrentSet<Q> implements Set<Q>
{
  /** Piggy back off a concurrent hash map to get "weekly consistent" iterators etc */
  private ConcurrentHashMap<Q, Object> map = new ConcurrentHashMap<Q, Object>();

  /**
   * 
   */
  public ConcurrentSet() {
    this.map = new ConcurrentHashMap<Q, Object>();
  }

  /* (non-Javadoc)
   * @see java.util.Set#add(E)
   */
  public boolean add(Q item) {
    boolean containsObj = map.containsKey(item);
    if (containsObj == false)
    {
      /* ConcurrentHashMap doesn't allow null keys or values so we simply 
       * use the item added to the collection as the key and the Boolean 
       * TRUE object as the value. */
      map.put(item, Boolean.TRUE);
    }
    return !containsObj;
  }

  /* (non-Javadoc)
   * @see java.util.Set#addAll(java.util.Collection)
   */
  public boolean addAll(Collection<? extends Q> items) {
    boolean changed = false;
    for (Q item : items)
    {
      /* update flag determining whether set has changed or not */
      changed = add(item) || changed;
    }
    return changed;
  }

  /* (non-Javadoc)
   * @see java.util.Set#clear()
   */
  public void clear() {
    map.clear();
  }

  /* (non-Javadoc)
   * @see java.util.Set#contains(java.lang.Object)
   */
  public boolean contains(Object item) {
    return map.containsKey(item);
  }

  /* (non-Javadoc)
   * @see java.util.Set#containsAll(java.util.Collection)
   */
  public boolean containsAll(Collection<?> items) {
    return map.keySet().containsAll(items);
  }

  /* (non-Javadoc)
   * @see java.util.Set#isEmpty()
   */
  public boolean isEmpty() {
    return map.isEmpty();
  }

  /* (non-Javadoc)
   * @see java.util.Set#iterator()
   */
  public Iterator<Q> iterator() {
    return map.keySet().iterator();
  }

  /* (non-Javadoc)
   * @see java.util.Set#remove(java.lang.Object)
   */
  public boolean remove(Object item) {
    /* we double up argument as both key and value */
    return map.remove(item, Boolean.TRUE);
  }

  /* (non-Javadoc)
   * @see java.util.Set#removeAll(java.util.Collection)
   */
  public boolean removeAll(Collection<?> items) {
    return map.keySet().removeAll(items);
  }

  /* (non-Javadoc)
   * @see java.util.Set#retainAll(java.util.Collection)
   */
  public boolean retainAll(Collection<?> items) {
    return map.keySet().retainAll(items);
  }

  /* (non-Javadoc)
   * @see java.util.Set#size()
   */
  public int size() {
    return map.size();
  }

  /* (non-Javadoc)
   * @see java.util.Set#toArray()
   */
  public Object[] toArray() {
    return map.keySet().toArray();
  }

  /* (non-Javadoc)
   * @see java.util.Set#toArray(T[])
   */
  public <T> T[] toArray(T[] array) {
    return map.keySet().toArray(array);
  }


}

   
    
    
  








Related examples in the same category

1.Java 1.5 (5.0) new features: PriorityQueueJava 1.5 (5.0) new features: PriorityQueue
2.Safe list copySafe list copy
3.Safe vector copySafe vector copy
4.Safe collection operationSafe collection operation
5.Java 1.5 (5.0) new feature: collection and thread
6.Java Thread Performance: Collection Test
7.Java Thread Performance: AtomicTest
8.Rhyming WordsRhyming Words
9.Communicate between threads using a Queue
10.Using a Thread-Local Variable
11.A work queue is used to coordinate work between a producer and a set of worker threads.
12.Return a value from a thread.
13.A multithreaded queue used for implementing producer-consumer style threading patternsA multithreaded queue used for implementing producer-consumer style threading patterns
14.Customized java.util.ArrayList: operate in a multithreaded environment where the large majority of method calls are read-only, instead of structural changes.
15.Customized java.util.HashMap: operate in a multithreaded environment where the large majority of method calls are read-only, instead of structural changes.
16.Customized java.util.TreeMap: operate in a multithreaded environment where the large majority of method calls are read-only, instead of structural changes.