Javolution 6.0.0 java
AtomicCollectionImpl.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.util.internal.collection;
10 
11 import java.util.Collection;
12 import java.util.Iterator;
13 
17 
21 public class AtomicCollectionImpl<E> extends CollectionView<E> {
22 
24  private class IteratorImpl implements Iterator<E> {
25  private E current;
26  private final Iterator<E> targetIterator;
27 
28  public IteratorImpl() {
29  targetIterator = targetView().iterator();
30  }
31 
32  @Override
33  public boolean hasNext() {
34  return targetIterator.hasNext();
35  }
36 
37  @Override
38  public E next() {
39  current = targetIterator.next();
40  return current;
41  }
42 
43  @Override
44  public void remove() {
45  if (current == null) throw new IllegalStateException();
47  current = null;
48  }
49  }
50 
51  private static final long serialVersionUID = 0x600L; // Version.
52  protected volatile CollectionService<E> immutable; // The copy used by readers.
53  protected transient Thread updatingThread; // The thread executing an update.
54 
56  super(target);
57  this.immutable = cloneTarget();
58  }
59 
60  @Override
61  public synchronized boolean add(E element) {
62  boolean changed = target().add(element);
63  if (changed && !updateInProgress()) immutable = cloneTarget();
64  return changed;
65  }
66 
67  @Override
68  public synchronized boolean addAll(Collection<? extends E> c) {
69  boolean changed = target().addAll(c);
70  if (changed && !updateInProgress()) immutable = cloneTarget();
71  return changed;
72  }
73 
74  @Override
75  public synchronized void clear() {
76  clear();
77  if (!updateInProgress()) {
79  }
80  }
81 
82  @Override
83  public synchronized AtomicCollectionImpl<E> clone() { // Synchronized required since working with real target.
85  copy.updatingThread = null;
86  return copy;
87  }
88 
89  @Override
91  return immutable.comparator();
92  }
93 
94  @Override
95  public boolean contains(Object o) {
96  return targetView().contains(o);
97  }
98 
99  @Override
100  public boolean containsAll(Collection<?> c) {
101  return targetView().containsAll(c);
102  }
103 
104  @Override
105  public boolean equals(Object o) {
106  return targetView().equals(o);
107  }
108 
109  @Override
110  public int hashCode() {
111  return targetView().hashCode();
112  }
113 
114  @Override
115  public boolean isEmpty() {
116  return targetView().isEmpty();
117  }
118 
119  @Override
120  public Iterator<E> iterator() {
121  return new IteratorImpl();
122  }
123 
124  @Override
125  public synchronized boolean remove(Object o) {
126  boolean changed = target().remove(o);
127  if (changed && !updateInProgress()) immutable = cloneTarget();
128  return changed;
129  }
130 
131  @Override
132  public synchronized boolean removeAll(Collection<?> c) {
133  boolean changed = target().removeAll(c);
134  if (changed && !updateInProgress()) immutable = cloneTarget();
135  return changed;
136  }
137 
138  @Override
139  public synchronized boolean retainAll(Collection<?> c) {
140  boolean changed = target().retainAll(c);
141  if (changed && !updateInProgress()) immutable = cloneTarget();
142  return changed;
143  }
144 
145  @Override
146  public int size() {
147  return targetView().size();
148  }
149 
150  @SuppressWarnings("unchecked")
151  @Override
152  public CollectionService<E>[] split(int n) { // Split not supported.
153  return new CollectionService[] { this };
154  }
155 
156  @Override
158  return this;
159  }
160 
161  @Override
162  public Object[] toArray() {
163  return targetView().toArray();
164  }
165 
166  @Override
167  public <T> T[] toArray(T[] a) {
168  return targetView().toArray(a);
169  }
170 
171  @Override
172  public synchronized void update(Consumer<CollectionService<E>> action,
173  CollectionService<E> view) {
174  updatingThread = Thread.currentThread(); // Update in progress.
175  try {
176  target().update(action, view); // No copy performed.
177  } finally {
178  updatingThread = null;
179  immutable = cloneTarget(); // One single copy !
180  }
181  }
182 
186  return ((updatingThread == null) || (updatingThread != Thread.currentThread()))
187  ? immutable : target();
188  }
189 
192  try {
193  return target().clone();
194  } catch (CloneNotSupportedException e) {
195  throw new Error("Cannot happen since target is Cloneable.");
196  }
197  }
198 
200  protected final boolean updateInProgress() {
201  return updatingThread == Thread.currentThread();
202 
203  }
204 }
205 
javolution.util.internal.collection.AtomicCollectionImpl.updateInProgress
final boolean updateInProgress()
Definition: AtomicCollectionImpl.java:200
javolution.util.internal.collection.AtomicCollectionImpl.IteratorImpl.targetIterator
final Iterator< E > targetIterator
Definition: AtomicCollectionImpl.java:26
javolution
javolution.util.service
Definition: BitSetService.java:9
javolution.util.internal.collection.CollectionView
Definition: CollectionView.java:29
javolution.util.internal.collection.AtomicCollectionImpl.toArray
public< T > T[] toArray(T[] a)
Definition: AtomicCollectionImpl.java:167
javolution.util.internal.collection.AtomicCollectionImpl.cloneTarget
CollectionService< E > cloneTarget()
Definition: AtomicCollectionImpl.java:191
javolution.util.internal.collection.AtomicCollectionImpl.iterator
Iterator< E > iterator()
Definition: AtomicCollectionImpl.java:120
javolution.util.internal.collection.AtomicCollectionImpl.split
CollectionService< E >[] split(int n)
Definition: AtomicCollectionImpl.java:152
javolution.util.internal.collection.AtomicCollectionImpl.toArray
Object[] toArray()
Definition: AtomicCollectionImpl.java:162
javolution.util.internal.collection.AtomicCollectionImpl.retainAll
synchronized boolean retainAll(Collection<?> c)
Definition: AtomicCollectionImpl.java:139
javolution.util.internal.collection.AtomicCollectionImpl.contains
boolean contains(Object o)
Definition: AtomicCollectionImpl.java:95
javolution.util.internal.collection.AtomicCollectionImpl.serialVersionUID
static final long serialVersionUID
Definition: AtomicCollectionImpl.java:51
javolution.util.internal.collection.AtomicCollectionImpl.IteratorImpl.hasNext
boolean hasNext()
Definition: AtomicCollectionImpl.java:33
javolution.util.function.Consumer
Definition: Consumer.java:22
javolution.util.service.CollectionService
Definition: CollectionService.java:25
javolution.util.internal.collection.AtomicCollectionImpl.updatingThread
transient Thread updatingThread
Definition: AtomicCollectionImpl.java:53
javolution.util.internal.collection.AtomicCollectionImpl.update
synchronized void update(Consumer< CollectionService< E >> action, CollectionService< E > view)
Definition: AtomicCollectionImpl.java:172
javolution.util.function.Equality
Definition: Equality.java:39
javolution.util.internal.collection.AtomicCollectionImpl.IteratorImpl.current
E current
Definition: AtomicCollectionImpl.java:25
javolution.util.internal.collection.CollectionView.target
CollectionService< E > target
Definition: CollectionView.java:33
javolution.util.internal.collection.AtomicCollectionImpl.clear
synchronized void clear()
Definition: AtomicCollectionImpl.java:75
javolution.util.internal.collection.AtomicCollectionImpl.AtomicCollectionImpl
AtomicCollectionImpl(CollectionService< E > target)
Definition: AtomicCollectionImpl.java:55
javolution.util.internal.collection.AtomicCollectionImpl.isEmpty
boolean isEmpty()
Definition: AtomicCollectionImpl.java:115
javolution.util.internal.collection.AtomicCollectionImpl
Definition: AtomicCollectionImpl.java:21
javolution.util.internal.collection.AtomicCollectionImpl.addAll
synchronized boolean addAll(Collection<? extends E > c)
Definition: AtomicCollectionImpl.java:68
javolution.util.internal.collection.AtomicCollectionImpl.equals
boolean equals(Object o)
Definition: AtomicCollectionImpl.java:105
javolution.util.internal.collection.AtomicCollectionImpl.add
synchronized boolean add(E element)
Definition: AtomicCollectionImpl.java:61
javolution.util.internal.collection.AtomicCollectionImpl.IteratorImpl.IteratorImpl
IteratorImpl()
Definition: AtomicCollectionImpl.java:28
javolution.util.function
Definition: Consumer.java:9
javolution.util.internal.collection.AtomicCollectionImpl.threadSafe
CollectionService< E > threadSafe()
Definition: AtomicCollectionImpl.java:157
javolution.util.internal.collection.AtomicCollectionImpl.containsAll
boolean containsAll(Collection<?> c)
Definition: AtomicCollectionImpl.java:100
javolution.util.internal.collection.AtomicCollectionImpl.size
int size()
Definition: AtomicCollectionImpl.java:146
javolution.util.internal.collection.AtomicCollectionImpl.IteratorImpl.next
E next()
Definition: AtomicCollectionImpl.java:38
javolution.util.internal.collection.AtomicCollectionImpl.clone
synchronized AtomicCollectionImpl< E > clone()
Definition: AtomicCollectionImpl.java:83
javolution.util.internal.collection.AtomicCollectionImpl.removeAll
synchronized boolean removeAll(Collection<?> c)
Definition: AtomicCollectionImpl.java:132
javolution.util.internal.collection.AtomicCollectionImpl.remove
synchronized boolean remove(Object o)
Definition: AtomicCollectionImpl.java:125
javolution.util.internal.collection.AtomicCollectionImpl.IteratorImpl
Definition: AtomicCollectionImpl.java:24
javolution.util.internal.collection.AtomicCollectionImpl.hashCode
int hashCode()
Definition: AtomicCollectionImpl.java:110
Thread
javolution.util
Definition: FastBitSet.java:9
javolution.util.internal.collection.AtomicCollectionImpl.comparator
Equality<? super E > comparator()
Definition: AtomicCollectionImpl.java:90
javolution.util.internal.collection.AtomicCollectionImpl.targetView
CollectionService< E > targetView()
Definition: AtomicCollectionImpl.java:185
javolution.util.internal.collection.AtomicCollectionImpl.immutable
volatile CollectionService< E > immutable
Definition: AtomicCollectionImpl.java:52