Javolution 6.0.0 java
AtomicMapImpl.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.map;
10 
11 import java.util.Iterator;
12 import java.util.Map;
13 
17 
21 public class AtomicMapImpl<K, V> extends MapView<K, V> {
22 
24  private class IteratorImpl implements Iterator<Entry<K, V>> {
25  private Entry<K, V> current;
26  private final Iterator<Entry<K, V>> targetIterator = targetView().iterator();
27 
28  @Override
29  public boolean hasNext() {
30  return targetIterator.hasNext();
31  }
32 
33  @Override
34  public Entry<K, V> next() {
35  current = targetIterator.next();
36  return current;
37  }
38 
39  @Override
40  public void remove() {
41  if (current == null) throw new IllegalStateException();
42  AtomicMapImpl.this.remove(current.getKey());
43  current = null;
44  }
45  }
46 
47  private static final long serialVersionUID = 0x600L; // Version.
48  protected volatile MapService<K, V> immutable; // The copy used by readers.
49  protected transient Thread updatingThread; // The thread executing an update.
50 
52  super(target);
53  this.immutable = cloneTarget();
54  }
55 
56  @Override
57  public synchronized void clear() {
58  clear();
59  if (!updateInProgress()) {
61  }
62  }
63 
64  @Override
65  public synchronized AtomicMapImpl<K, V> clone() {
67  copy.updatingThread = null;
68  return copy;
69  }
70 
71  @Override
72  public boolean containsKey(Object key) {
73  return targetView().containsKey(key);
74  }
75 
76  @Override
77  public boolean containsValue(Object value) {
78  return targetView().containsValue(value);
79  }
80 
81  @Override
82  public V get(Object key) {
83  return targetView().get(key);
84  }
85 
86  @Override
87  public boolean isEmpty() {
88  return targetView().isEmpty();
89  }
90 
91  @Override
92  public Iterator<Entry<K, V>> iterator() {
93  return new IteratorImpl();
94  }
95 
96  @Override
98  return targetView().keyComparator();
99  }
100 
101  @Override
102  public synchronized V put(K key, V value) {
103  V v = target().put(key, value);
105  return v;
106  }
107 
108  @Override
109  public synchronized void putAll(Map<? extends K, ? extends V> m) {
110  target().putAll(m);
112  }
113 
114  @Override
115  public synchronized V putIfAbsent(K key, V value) {
116  V v = target().putIfAbsent(key, value);
118  return v;
119  }
120 
121  @Override
122  public synchronized V remove(Object key) {
123  V v = target().remove(key);
125  return v;
126  }
127 
128  @Override
129  public synchronized boolean remove(Object key, Object value) {
130  boolean changed = target().remove(key, value);
131  if (changed && !updateInProgress()) immutable = cloneTarget();
132  return changed;
133  }
134 
135  @Override
136  public synchronized V replace(K key, V value) {
137  V v = target().replace(key, value);
139  return v;
140  }
141 
142  @Override
143  public synchronized boolean replace(K key, V oldValue, V newValue) {
144  boolean changed = target().replace(key, oldValue, newValue);
145  if (changed && !updateInProgress()) immutable = cloneTarget();
146  return changed;
147  }
148 
149  @Override
150  public int size() {
151  return targetView().size();
152  }
153 
154  @SuppressWarnings("unchecked")
155  @Override
156  public MapService<K, V>[] split(int n) { // Split not supported.
157  return new MapService[] { this };
158  }
159 
160  @Override
162  return this;
163  }
164 
165  @Override
166  public synchronized void update(Consumer<MapService<K, V>> action,
167  MapService<K, V> view) {
168  updatingThread = Thread.currentThread(); // Update in progress.
169  try {
170  target().update(action, view); // No copy performed.
171  } finally {
172  updatingThread = null;
173  immutable = cloneTarget(); // One single copy !
174  }
175  }
176 
177  @Override
179  return targetView().valueComparator();
180  }
181 
184  try {
185  return target().clone();
186  } catch (CloneNotSupportedException e) {
187  throw new Error("Cannot happen since target is Cloneable.");
188  }
189  }
190 
194  return ((updatingThread == null) || (updatingThread != Thread.currentThread()))
195  ? immutable : target();
196  }
197 
198 
200  protected final boolean updateInProgress() {
201  return updatingThread == Thread.currentThread();
202  }
203 }
javolution.util.internal.map.AtomicMapImpl.updateInProgress
final boolean updateInProgress()
Definition: AtomicMapImpl.java:200
javolution
javolution.util.service
Definition: BitSetService.java:9
javolution.util.internal.map.AtomicMapImpl.targetView
MapService< K, V > targetView()
Definition: AtomicMapImpl.java:193
javolution.util.internal.map.AtomicMapImpl.replace
synchronized boolean replace(K key, V oldValue, V newValue)
Definition: AtomicMapImpl.java:143
javolution.util.internal.map.AtomicMapImpl.remove
synchronized V remove(Object key)
Definition: AtomicMapImpl.java:122
javolution.util.internal.map.MapView
Definition: MapView.java:29
javolution.util.internal.map.AtomicMapImpl.immutable
volatile MapService< K, V > immutable
Definition: AtomicMapImpl.java:48
javolution.util.internal.map.AtomicMapImpl.iterator
Iterator< Entry< K, V > > iterator()
Definition: AtomicMapImpl.java:92
javolution.util.internal.map.AtomicMapImpl.AtomicMapImpl
AtomicMapImpl(MapService< K, V > target)
Definition: AtomicMapImpl.java:51
javolution.util.internal.map.AtomicMapImpl.size
int size()
Definition: AtomicMapImpl.java:150
javolution.util.function.Consumer
Definition: Consumer.java:22
javolution.util.service.MapService
Definition: MapService.java:27
javolution.util.internal.map.AtomicMapImpl
Definition: AtomicMapImpl.java:21
javolution.util.internal.map.AtomicMapImpl.update
synchronized void update(Consumer< MapService< K, V >> action, MapService< K, V > view)
Definition: AtomicMapImpl.java:166
javolution.util.internal.map.AtomicMapImpl.clear
synchronized void clear()
Definition: AtomicMapImpl.java:57
javolution.util.function.Equality
Definition: Equality.java:39
javolution.util.internal.map.AtomicMapImpl.threadSafe
MapService< K, V > threadSafe()
Definition: AtomicMapImpl.java:161
javolution.util.internal.map.AtomicMapImpl.valueComparator
Equality<? super V > valueComparator()
Definition: AtomicMapImpl.java:178
javolution.util.internal.map.AtomicMapImpl.containsValue
boolean containsValue(Object value)
Definition: AtomicMapImpl.java:77
javolution.util.internal.map.AtomicMapImpl.clone
synchronized AtomicMapImpl< K, V > clone()
Definition: AtomicMapImpl.java:65
javolution.util.internal.map.AtomicMapImpl.IteratorImpl.next
Entry< K, V > next()
Definition: AtomicMapImpl.java:34
javolution.util.internal.map.AtomicMapImpl.IteratorImpl.current
Entry< K, V > current
Definition: AtomicMapImpl.java:25
javolution.util.internal.map.AtomicMapImpl.isEmpty
boolean isEmpty()
Definition: AtomicMapImpl.java:87
javolution.util.internal.map.AtomicMapImpl.cloneTarget
MapService< K, V > cloneTarget()
Definition: AtomicMapImpl.java:183
javolution.util.function
Definition: Consumer.java:9
javolution.util.internal.map.AtomicMapImpl.split
MapService< K, V >[] split(int n)
Definition: AtomicMapImpl.java:156
javolution.util.internal.map.AtomicMapImpl.replace
synchronized V replace(K key, V value)
Definition: AtomicMapImpl.java:136
javolution.util.internal.map.AtomicMapImpl.putAll
synchronized void putAll(Map<? extends K, ? extends V > m)
Definition: AtomicMapImpl.java:109
javolution.util.internal.map.AtomicMapImpl.containsKey
boolean containsKey(Object key)
Definition: AtomicMapImpl.java:72
javolution.util.internal.map.AtomicMapImpl.updatingThread
transient Thread updatingThread
Definition: AtomicMapImpl.java:49
javolution.util.internal.map.AtomicMapImpl.serialVersionUID
static final long serialVersionUID
Definition: AtomicMapImpl.java:47
javolution.util.internal.map.AtomicMapImpl.IteratorImpl.hasNext
boolean hasNext()
Definition: AtomicMapImpl.java:29
Thread
javolution.util.internal.map.AtomicMapImpl.keyComparator
Equality<? super K > keyComparator()
Definition: AtomicMapImpl.java:97
javolution.util.internal.map.AtomicMapImpl.IteratorImpl
Definition: AtomicMapImpl.java:24
javolution.util
Definition: FastBitSet.java:9
javolution.util.internal.map.AtomicMapImpl.put
synchronized V put(K key, V value)
Definition: AtomicMapImpl.java:102
javolution.util.internal.map.MapView.target
MapService< K, V > target
Definition: MapView.java:213
javolution.util.internal.map.AtomicMapImpl.IteratorImpl.targetIterator
final Iterator< Entry< K, V > > targetIterator
Definition: AtomicMapImpl.java:26
javolution.util.internal.map.AtomicMapImpl.putIfAbsent
synchronized V putIfAbsent(K key, V value)
Definition: AtomicMapImpl.java:115