ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/RWMap.java
(Generate patch)

Comparing jsr166/src/test/loops/RWMap.java (file contents):
Revision 1.8 by jsr166, Mon Dec 5 04:08:46 2011 UTC vs.
Revision 1.9 by dl, Thu May 3 10:11:55 2012 UTC

# Line 13 | Line 13 | import java.util.concurrent.locks.*;
13   * that places read-write locks around unsynchronized Maps.
14   * Exists as a sample input for MapLoops test.
15   */
16 < public class RWMap implements Map {
16 > public class RWMap implements ConcurrentMap {
17      private final Map m;
18      private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
19  
# Line 103 | Line 103 | public class RWMap implements Map {
103          finally { l.unlock(); }
104      }
105  
106 +    public Object putIfAbsent(Object key, Object value) {
107 +        ReentrantReadWriteLock.WriteLock l = rwl.writeLock();
108 +        l.lock();
109 +        try {
110 +            Object v = m.get(key);
111 +            return v == null?  m.put(key, value) : v;
112 +        }
113 +        finally { l.unlock(); }
114 +    }
115 +
116 +    public boolean replace(Object key, Object oldValue, Object newValue) {
117 +        ReentrantReadWriteLock.WriteLock l = rwl.writeLock();
118 +        l.lock();
119 +        try {
120 +            if (m.get(key).equals(oldValue)) {
121 +                m.put(key, newValue);
122 +                return true;
123 +            }
124 +            return false;
125 +        }
126 +        finally { l.unlock(); }
127 +    }
128 +
129 +    public Object replace(Object key, Object newValue) {
130 +        ReentrantReadWriteLock.WriteLock l = rwl.writeLock();
131 +        l.lock();
132 +        try {
133 +            if (m.containsKey(key))
134 +                return m.put(key, newValue);
135 +            return null;
136 +        }
137 +        finally { l.unlock(); }
138 +    }
139 +
140      public Object remove(Object key) {
141          ReentrantReadWriteLock.WriteLock l = rwl.writeLock();
142          l.lock();
# Line 110 | Line 144 | public class RWMap implements Map {
144          finally { l.unlock(); }
145      }
146  
147 +    public boolean remove(Object key, Object value) {
148 +        ReentrantReadWriteLock.WriteLock l = rwl.writeLock();
149 +        l.lock();
150 +        try {
151 +            if (m.get(key).equals(value)) {
152 +                m.remove(key);
153 +                return true;
154 +            }
155 +            return false;
156 +        }
157 +        finally { l.unlock(); }
158 +    }
159 +
160      public void putAll(Map map) {
161          ReentrantReadWriteLock.WriteLock l = rwl.writeLock();
162          l.lock();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines