protected M copy() { lock.lock(); try { return copy(delegate); } finally { lock.unlock(); } }
public final void clear() { lock.lock(); try { set(copy(Collections.<K, V> emptyMap())); } finally { lock.unlock(); } }
public final void putAll(final Map<? extends K, ? extends V> t) { lock.lock(); try { final M map = copy(); map.putAll(t); set(map); } finally { lock.unlock(); } }
public final V put(final K key, final V value) { lock.lock(); try { final M map = copy(); try { return map.put(key, value); } finally { set(map); } } finally { lock.unlock(); } }
public V putIfAbsent(final K key, final V value) { lock.lock(); try { if (!delegate.containsKey(key)) { final M map = copy(); try { return map.put(key, value); } finally { set(map); } } return delegate.get(key); } finally { lock.unlock(); } }
public final V remove(final Object key) { lock.lock(); try { // short circuit if key doesn't exist if (!delegate.containsKey(key)) { return null; } final M map = copy(); try { return map.remove(key); } finally { set(map); } } finally { lock.unlock(); } }
public boolean remove(final Object key, final Object value) { lock.lock(); try { if (delegate.containsKey(key) && equals(value, delegate.get(key))) { final M map = copy(); map.remove(key); set(map); return true; } else { return false; } } finally { lock.unlock(); } }
public V replace(final K key, final V value) { lock.lock(); try { if (!delegate.containsKey(key)) { return null; } final M map = copy(); try { return map.put(key, value); } finally { set(map); } } finally { lock.unlock(); } }
public boolean replace(final K key, final V oldValue, final V newValue) { lock.lock(); try { if (!delegate.containsKey(key) || !equals(oldValue, delegate.get(key))) { return false; } final M map = copy(); map.put(key, newValue); set(map); return true; } finally { lock.unlock(); } }
/** * Create a new {@link CopyOnWriteMap} with the supplied {@link Map} to * initialize the values. * * @param map the initial map to initialize with * @param viewType for writable or read-only key, value and entrySet views */ protected <N extends Map<? extends K, ? extends V>> AbstractCopyOnWriteMap(final N map, final View.Type viewType) { this.delegate = notNull("delegate", copy(notNull("map", map))); this.view = notNull("viewType", viewType).get(this); }