--- jsr166/src/test/loops/RWMap.java 2011/12/05 04:08:46 1.8 +++ jsr166/src/test/loops/RWMap.java 2012/05/03 10:11:55 1.9 @@ -13,7 +13,7 @@ import java.util.concurrent.locks.*; * 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 +103,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 +144,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();