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.12 by jsr166, Thu Jan 15 18:34:19 2015 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines