## EDU.oswego.cs.dl.util.concurrent
Class CopyOnWriteArraySet

    java.lang.Object
      java.util.AbstractCollection<E>
          java.util.AbstractSet
              EDU.oswego.cs.dl.util.concurrent.CopyOnWriteArraySet

All Implemented Interfaces:
  java.io.Serializable, java.lang.Cloneable, java.lang.Iterable, java.util.Collection, java.util.Set

    public class CopyOnWriteArraySet

extends java.util.AbstractSet
implements java.lang.Cloneable, java.io.Serializable

This class implements a java.util.Set that uses a CopyOnWriteArrayList for all of its operations. Thus, it shares the same basic properties:

- It is best suited for applications in which set sizes generally stay small, read-only operations vastly outnumber mutative operations, and you need to prevent interference among threads during traversal.
- Mutative operations(add, set, remove, etc) are fairly expensive since they usually entail copying the entire underlying array.
- Loops involving repeated element-by-element mutative operations are so expensive that they should generally be avoided.
- Iterators do not support the mutative remove operation
- Traversal via iterators is very fast and cannot ever encounter interference from other threads. Iterators rely on unchanging snapshots of the array at the time the iterators were constructed

Sample Usage. Probably the main application of copy-on-write sets are classes that maintain sets of Handler objects that must be multicasted to upon an update command. This is a classic case where you do not want to be holding a synch lock while sending a message, and where traversals normally vastly overwhelm additions.

     class  Handler { void handle(); ... }

     class X {
        private final CopyOnWriteArraySet handlers = new CopyOnWriteArraySet();
        public void addHandler(Handler h) { handlers.add(h); }

        private long internalState;
        private synchronized void changeState() { internalState = ...; }

        public void update() {
           changeState();
           Iterator it = handlers.iterator();
           while (it.hasNext())
              ((Handler)(it.next()).handle();
        }
     }

[ Introduction to this package. ]

See Also:
  `CopyOnWriteArrayList`, Serialized Form

Field Summary
`protected CopyOnWriteArrayList` `al`

Constructor Summary
`CopyOnWriteArraySet()` Constructs an empty set
`CopyOnWriteArraySet(java.util.Collection c)` Constructs a set containing all of the elements of the specified Collection.

Method Summary
`boolean` `add(java.lang.Object o)`
`boolean` `addAll(java.util.Collection c)`
`void` `clear()`
`boolean` `contains(java.lang.Object o)`
`boolean` `containsAll(java.util.Collection c)`
`boolean` `isEmpty()`
`java.util.Iterator` `iterator()`
`boolean` `remove(java.lang.Object o)`
`boolean` `removeAll(java.util.Collection c)`
`boolean` `retainAll(java.util.Collection c)`
`int` `size()`
`java.lang.Object[]` `toArray()`
`java.lang.Object[]` `toArray(java.lang.Object[] a)`

Methods inherited from class java.util.AbstractSet
`equals, hashCode, removeAll`

Methods inherited from class java.util.AbstractCollection
`addAll, containsAll, retainAll, toArray, toString`

Methods inherited from class java.lang.Object
`clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

Methods inherited from interface java.util.Set
`addAll, containsAll, retainAll, toArray`

Field Detail

### al

    protected final CopyOnWriteArrayList al

Constructor Detail

### CopyOnWriteArraySet

    public CopyOnWriteArraySet()

  Constructs an empty set

### CopyOnWriteArraySet

    public CopyOnWriteArraySet(java.util.Collection c)

  Constructs a set containing all of the elements of the specified Collection.

Method Detail

### size

    public int size()

  Specified by:
    `size` in interface `java.util.Collection`
  Specified by:
    `size` in interface `java.util.Set`
  Specified by:
    `size` in class `java.util.AbstractCollection`

### isEmpty

    public boolean isEmpty()

  Specified by:
    `isEmpty` in interface `java.util.Collection`
  Specified by:
    `isEmpty` in interface `java.util.Set`
  Overrides:
    `isEmpty` in class `java.util.AbstractCollection`

### contains

    public boolean contains(java.lang.Object o)

  Specified by:
    `contains` in interface `java.util.Collection`
  Specified by:
    `contains` in interface `java.util.Set`
  Overrides:
    `contains` in class `java.util.AbstractCollection`

### toArray

    public java.lang.Object[] toArray()

  Specified by:
    `toArray` in interface `java.util.Collection`
  Specified by:
    `toArray` in interface `java.util.Set`
  Overrides:
    `toArray` in class `java.util.AbstractCollection`

### toArray

    public java.lang.Object[] toArray(java.lang.Object[] a)

  Overrides:
    `toArray` in class `java.util.AbstractCollection`

### clear

    public void clear()

  Specified by:
    `clear` in interface `java.util.Collection`
  Specified by:
    `clear` in interface `java.util.Set`
  Overrides:
    `clear` in class `java.util.AbstractCollection`

### iterator

    public java.util.Iterator iterator()

  Specified by:
    `iterator` in interface `java.lang.Iterable`
  Specified by:
    `iterator` in interface `java.util.Collection`
  Specified by:
    `iterator` in interface `java.util.Set`
  Specified by:
    `iterator` in class `java.util.AbstractCollection`

### remove

    public boolean remove(java.lang.Object o)

  Specified by:
    `remove` in interface `java.util.Collection`
  Specified by:
    `remove` in interface `java.util.Set`
  Overrides:
    `remove` in class `java.util.AbstractCollection`

### containsAll

    public boolean containsAll(java.util.Collection c)

  Overrides:
    `containsAll` in class `java.util.AbstractCollection`

### addAll

    public boolean addAll(java.util.Collection c)

  Overrides:
    `addAll` in class `java.util.AbstractCollection`

### removeAll

    public boolean removeAll(java.util.Collection c)

  Overrides:
    `removeAll` in class `java.util.AbstractSet`

### retainAll

    public boolean retainAll(java.util.Collection c)

  Overrides:
    `retainAll` in class `java.util.AbstractCollection`

### add

    public boolean add(java.lang.Object o)

  Specified by:
    `add` in interface `java.util.Collection`
  Specified by:
    `add` in interface `java.util.Set`
  Overrides:
    `add` in class `java.util.AbstractCollection`