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
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 |
al
protected final CopyOnWriteArrayList al
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.
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