Class 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
    • Constructor Summary

      Constructors 
      Constructor Description
      CopyOnWriteArraySet()
      Constructs an empty set
      CopyOnWriteArraySet​(java.util.Collection c)
      Constructs a set containing all of the elements of the specified Collection.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      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
      • Methods inherited from class java.util.AbstractCollection

        toString
      • Methods inherited from class java.lang.Object

        clone, finalize, getClass, notify, notifyAll, wait, wait, wait
      • Methods inherited from interface java.util.Collection

        parallelStream, removeIf, stream, toArray
      • Methods inherited from interface java.lang.Iterable

        forEach
      • Methods inherited from interface java.util.Set

        spliterator
    • 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)
        Specified by:
        toArray in interface java.util.Collection
        Specified by:
        toArray in interface java.util.Set
        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.util.Collection
        Specified by:
        iterator in interface java.lang.Iterable
        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)
        Specified by:
        containsAll in interface java.util.Collection
        Specified by:
        containsAll in interface java.util.Set
        Overrides:
        containsAll in class java.util.AbstractCollection
      • addAll

        public boolean addAll​(java.util.Collection c)
        Specified by:
        addAll in interface java.util.Collection
        Specified by:
        addAll in interface java.util.Set
        Overrides:
        addAll in class java.util.AbstractCollection
      • removeAll

        public boolean removeAll​(java.util.Collection c)
        Specified by:
        removeAll in interface java.util.Collection
        Specified by:
        removeAll in interface java.util.Set
        Overrides:
        removeAll in class java.util.AbstractSet
      • retainAll

        public boolean retainAll​(java.util.Collection c)
        Specified by:
        retainAll in interface java.util.Collection
        Specified by:
        retainAll in interface java.util.Set
        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