--- jsr166/src/test/loops/RWMap.java 2011/12/05 04:08:46 1.8 +++ jsr166/src/test/loops/RWMap.java 2015/01/15 18:34:19 1.12 @@ -7,13 +7,12 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.locks.*; - /** * This is an incomplete implementation of a wrapper class * that places read-write locks around unsynchronized Maps. * Exists as a sample input for MapLoops test. */ -public class RWMap implements Map { +public class RWMap implements ConcurrentMap { private final Map m; private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); @@ -103,6 +102,40 @@ public class RWMap implements Map { finally { l.unlock(); } } + public Object putIfAbsent(Object key, Object value) { + ReentrantReadWriteLock.WriteLock l = rwl.writeLock(); + l.lock(); + try { + Object v = m.get(key); + return (v == null) ? m.put(key, value) : v; + } + finally { l.unlock(); } + } + + public boolean replace(Object key, Object oldValue, Object newValue) { + ReentrantReadWriteLock.WriteLock l = rwl.writeLock(); + l.lock(); + try { + if (m.get(key).equals(oldValue)) { + m.put(key, newValue); + return true; + } + return false; + } + finally { l.unlock(); } + } + + public Object replace(Object key, Object newValue) { + ReentrantReadWriteLock.WriteLock l = rwl.writeLock(); + l.lock(); + try { + if (m.containsKey(key)) + return m.put(key, newValue); + return null; + } + finally { l.unlock(); } + } + public Object remove(Object key) { ReentrantReadWriteLock.WriteLock l = rwl.writeLock(); l.lock(); @@ -110,6 +143,19 @@ public class RWMap implements Map { finally { l.unlock(); } } + public boolean remove(Object key, Object value) { + ReentrantReadWriteLock.WriteLock l = rwl.writeLock(); + l.lock(); + try { + if (m.get(key).equals(value)) { + m.remove(key); + return true; + } + return false; + } + finally { l.unlock(); } + } + public void putAll(Map map) { ReentrantReadWriteLock.WriteLock l = rwl.writeLock(); l.lock();