1180 |
|
} |
1181 |
|
assertUnlocked(lock); |
1182 |
|
} |
1183 |
+ |
|
1184 |
+ |
/** |
1185 |
+ |
* Stamped locks are not reentrant. |
1186 |
+ |
*/ |
1187 |
+ |
public void testNonReentrant() throws InterruptedException { |
1188 |
+ |
final StampedLock lock = new StampedLock(); |
1189 |
+ |
long stamp; |
1190 |
+ |
|
1191 |
+ |
stamp = lock.writeLock(); |
1192 |
+ |
assertValid(lock, stamp); |
1193 |
+ |
assertEquals(0L, lock.tryWriteLock(0L, DAYS)); |
1194 |
+ |
assertEquals(0L, lock.tryReadLock(0L, DAYS)); |
1195 |
+ |
assertValid(lock, stamp); |
1196 |
+ |
lock.unlockWrite(stamp); |
1197 |
+ |
|
1198 |
+ |
stamp = lock.tryWriteLock(1L, DAYS); |
1199 |
+ |
assertEquals(0L, lock.tryWriteLock(0L, DAYS)); |
1200 |
+ |
assertValid(lock, stamp); |
1201 |
+ |
lock.unlockWrite(stamp); |
1202 |
+ |
|
1203 |
+ |
stamp = lock.readLock(); |
1204 |
+ |
assertEquals(0L, lock.tryWriteLock(0L, DAYS)); |
1205 |
+ |
assertValid(lock, stamp); |
1206 |
+ |
lock.unlockRead(stamp); |
1207 |
+ |
} |
1208 |
+ |
|
1209 |
+ |
/** |
1210 |
+ |
* """StampedLocks have no notion of ownership. Locks acquired in |
1211 |
+ |
* one thread can be released or converted in another.""" |
1212 |
+ |
*/ |
1213 |
+ |
public void testNoOwnership() throws Throwable { |
1214 |
+ |
ArrayList<Future<?>> futures = new ArrayList<>(); |
1215 |
+ |
for (Function<StampedLock, Long> writeLocker : writeLockers()) |
1216 |
+ |
for (BiConsumer<StampedLock, Long> writeUnlocker : writeUnlockers()) { |
1217 |
+ |
StampedLock lock = new StampedLock(); |
1218 |
+ |
long stamp = writeLocker.apply(lock); |
1219 |
+ |
futures.add(cachedThreadPool.submit(new CheckedRunnable() { |
1220 |
+ |
public void realRun() { |
1221 |
+ |
writeUnlocker.accept(lock, stamp); |
1222 |
+ |
assertUnlocked(lock); |
1223 |
+ |
assertFalse(lock.validate(stamp)); |
1224 |
+ |
}})); |
1225 |
+ |
} |
1226 |
+ |
for (Future<?> future : futures) |
1227 |
+ |
assertNull(future.get()); |
1228 |
+ |
} |
1229 |
|
} |