ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/StampedLockTest.java
Revision: 1.2
Committed: Fri Feb 1 21:44:41 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.1: +5 -2 lines
Log Message:
StampedLockTest, meet StampedLock!

File Contents

# Content
1 /*
2 * Written by Doug Lea and Martin Buchholz
3 * with assistance from members of JCP JSR-166 Expert Group and
4 * released to the public domain, as explained at
5 * http://creativecommons.org/publicdomain/zero/1.0/
6 * Other contributors include Andrew Wright, Jeffrey Hayes,
7 * Pat Fisher, Mike Judd.
8 */
9
10 import junit.framework.*;
11 import java.util.concurrent.atomic.AtomicBoolean;
12 import java.util.concurrent.locks.Condition;
13 import java.util.concurrent.locks.Lock;
14 import java.util.concurrent.locks.ReadWriteLock;
15 import java.util.concurrent.locks.StampedLock;
16 import java.util.concurrent.CountDownLatch;
17 import static java.util.concurrent.TimeUnit.MILLISECONDS;
18 import java.util.*;
19
20 public class StampedLockTest extends JSR166TestCase {
21 public static void main(String[] args) {
22 junit.textui.TestRunner.run(suite());
23 }
24 public static Test suite() {
25 return new TestSuite(StampedLockTest.class);
26 }
27
28 // XXXX Just a skeleton implementation for now.
29 public void testTODO() { fail("StampedLockTest needs help"); }
30
31 public void testConstructor() { new StampedLock(); }
32
33 // /**
34 // * A runnable calling lockInterruptibly
35 // */
36 // class InterruptibleLockRunnable extends CheckedRunnable {
37 // final ReentrantReadWriteLock lock;
38 // InterruptibleLockRunnable(ReentrantReadWriteLock l) { lock = l; }
39 // public void realRun() throws InterruptedException {
40 // lock.writeLock().lockInterruptibly();
41 // }
42 // }
43
44 // /**
45 // * A runnable calling lockInterruptibly that expects to be
46 // * interrupted
47 // */
48 // class InterruptedLockRunnable extends CheckedInterruptedRunnable {
49 // final ReentrantReadWriteLock lock;
50 // InterruptedLockRunnable(ReentrantReadWriteLock l) { lock = l; }
51 // public void realRun() throws InterruptedException {
52 // lock.writeLock().lockInterruptibly();
53 // }
54 // }
55
56 // /**
57 // * Subclass to expose protected methods
58 // */
59 // static class PublicReentrantReadWriteLock extends ReentrantReadWriteLock {
60 // PublicReentrantReadWriteLock() { super(); }
61 // PublicReentrantReadWriteLock(boolean fair) { super(fair); }
62 // public Thread getOwner() {
63 // return super.getOwner();
64 // }
65 // public Collection<Thread> getQueuedThreads() {
66 // return super.getQueuedThreads();
67 // }
68 // public Collection<Thread> getWaitingThreads(Condition c) {
69 // return super.getWaitingThreads(c);
70 // }
71 // }
72
73 // /**
74 // * Releases write lock, checking that it had a hold count of 1.
75 // */
76 // void releaseWriteLock(PublicReentrantReadWriteLock lock) {
77 // ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
78 // assertWriteLockedByMoi(lock);
79 // assertEquals(1, lock.getWriteHoldCount());
80 // writeLock.unlock();
81 // assertNotWriteLocked(lock);
82 // }
83
84 // /**
85 // * Spin-waits until lock.hasQueuedThread(t) becomes true.
86 // */
87 // void waitForQueuedThread(PublicReentrantReadWriteLock lock, Thread t) {
88 // long startTime = System.nanoTime();
89 // while (!lock.hasQueuedThread(t)) {
90 // if (millisElapsedSince(startTime) > LONG_DELAY_MS)
91 // throw new AssertionFailedError("timed out");
92 // Thread.yield();
93 // }
94 // assertTrue(t.isAlive());
95 // assertTrue(lock.getOwner() != t);
96 // }
97
98 // /**
99 // * Checks that lock is not write-locked.
100 // */
101 // void assertNotWriteLocked(PublicReentrantReadWriteLock lock) {
102 // assertFalse(lock.isWriteLocked());
103 // assertFalse(lock.isWriteLockedByCurrentThread());
104 // assertFalse(lock.writeLock().isHeldByCurrentThread());
105 // assertEquals(0, lock.getWriteHoldCount());
106 // assertEquals(0, lock.writeLock().getHoldCount());
107 // assertNull(lock.getOwner());
108 // }
109
110 // /**
111 // * Checks that lock is write-locked by the given thread.
112 // */
113 // void assertWriteLockedBy(PublicReentrantReadWriteLock lock, Thread t) {
114 // assertTrue(lock.isWriteLocked());
115 // assertSame(t, lock.getOwner());
116 // assertEquals(t == Thread.currentThread(),
117 // lock.isWriteLockedByCurrentThread());
118 // assertEquals(t == Thread.currentThread(),
119 // lock.writeLock().isHeldByCurrentThread());
120 // assertEquals(t == Thread.currentThread(),
121 // lock.getWriteHoldCount() > 0);
122 // assertEquals(t == Thread.currentThread(),
123 // lock.writeLock().getHoldCount() > 0);
124 // assertEquals(0, lock.getReadLockCount());
125 // }
126
127 // /**
128 // * Checks that lock is write-locked by the current thread.
129 // */
130 // void assertWriteLockedByMoi(PublicReentrantReadWriteLock lock) {
131 // assertWriteLockedBy(lock, Thread.currentThread());
132 // }
133
134 // /**
135 // * Checks that condition c has no waiters.
136 // */
137 // void assertHasNoWaiters(PublicReentrantReadWriteLock lock, Condition c) {
138 // assertHasWaiters(lock, c, new Thread[] {});
139 // }
140
141 // /**
142 // * Checks that condition c has exactly the given waiter threads.
143 // */
144 // void assertHasWaiters(PublicReentrantReadWriteLock lock, Condition c,
145 // Thread... threads) {
146 // lock.writeLock().lock();
147 // assertEquals(threads.length > 0, lock.hasWaiters(c));
148 // assertEquals(threads.length, lock.getWaitQueueLength(c));
149 // assertEquals(threads.length == 0, lock.getWaitingThreads(c).isEmpty());
150 // assertEquals(threads.length, lock.getWaitingThreads(c).size());
151 // assertEquals(new HashSet<Thread>(lock.getWaitingThreads(c)),
152 // new HashSet<Thread>(Arrays.asList(threads)));
153 // lock.writeLock().unlock();
154 // }
155
156 // enum AwaitMethod { await, awaitTimed, awaitNanos, awaitUntil };
157
158 // /**
159 // * Awaits condition using the specified AwaitMethod.
160 // */
161 // void await(Condition c, AwaitMethod awaitMethod)
162 // throws InterruptedException {
163 // switch (awaitMethod) {
164 // case await:
165 // c.await();
166 // break;
167 // case awaitTimed:
168 // assertTrue(c.await(2 * LONG_DELAY_MS, MILLISECONDS));
169 // break;
170 // case awaitNanos:
171 // long nanosRemaining = c.awaitNanos(MILLISECONDS.toNanos(2 * LONG_DELAY_MS));
172 // assertTrue(nanosRemaining > 0);
173 // break;
174 // case awaitUntil:
175 // java.util.Date d = new java.util.Date();
176 // assertTrue(c.awaitUntil(new java.util.Date(d.getTime() + 2 * LONG_DELAY_MS)));
177 // break;
178 // }
179 // }
180
181 // /**
182 // * Constructor sets given fairness, and is in unlocked state
183 // */
184 // public void testConstructor() {
185 // PublicReentrantReadWriteLock lock;
186
187 // lock = new PublicReentrantReadWriteLock();
188 // assertFalse(lock.isFair());
189 // assertNotWriteLocked(lock);
190 // assertEquals(0, lock.getReadLockCount());
191
192 // lock = new PublicReentrantReadWriteLock(true);
193 // assertTrue(lock.isFair());
194 // assertNotWriteLocked(lock);
195 // assertEquals(0, lock.getReadLockCount());
196
197 // lock = new PublicReentrantReadWriteLock(false);
198 // assertFalse(lock.isFair());
199 // assertNotWriteLocked(lock);
200 // assertEquals(0, lock.getReadLockCount());
201 // }
202
203 // /**
204 // * write-locking and read-locking an unlocked lock succeed
205 // */
206 // public void testLock() { testLock(false); }
207 // public void testLock_fair() { testLock(true); }
208 // public void testLock(boolean fair) {
209 // PublicReentrantReadWriteLock lock =
210 // new PublicReentrantReadWriteLock(fair);
211 // assertNotWriteLocked(lock);
212 // lock.writeLock().lock();
213 // assertWriteLockedByMoi(lock);
214 // lock.writeLock().unlock();
215 // assertNotWriteLocked(lock);
216 // assertEquals(0, lock.getReadLockCount());
217 // lock.readLock().lock();
218 // assertNotWriteLocked(lock);
219 // assertEquals(1, lock.getReadLockCount());
220 // lock.readLock().unlock();
221 // assertNotWriteLocked(lock);
222 // assertEquals(0, lock.getReadLockCount());
223 // }
224
225 // /**
226 // * getWriteHoldCount returns number of recursive holds
227 // */
228 // public void testGetWriteHoldCount() { testGetWriteHoldCount(false); }
229 // public void testGetWriteHoldCount_fair() { testGetWriteHoldCount(true); }
230 // public void testGetWriteHoldCount(boolean fair) {
231 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
232 // for (int i = 1; i <= SIZE; i++) {
233 // lock.writeLock().lock();
234 // assertEquals(i,lock.getWriteHoldCount());
235 // }
236 // for (int i = SIZE; i > 0; i--) {
237 // lock.writeLock().unlock();
238 // assertEquals(i-1,lock.getWriteHoldCount());
239 // }
240 // }
241
242 // /**
243 // * writelock.getHoldCount returns number of recursive holds
244 // */
245 // public void testGetHoldCount() { testGetHoldCount(false); }
246 // public void testGetHoldCount_fair() { testGetHoldCount(true); }
247 // public void testGetHoldCount(boolean fair) {
248 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
249 // for (int i = 1; i <= SIZE; i++) {
250 // lock.writeLock().lock();
251 // assertEquals(i,lock.writeLock().getHoldCount());
252 // }
253 // for (int i = SIZE; i > 0; i--) {
254 // lock.writeLock().unlock();
255 // assertEquals(i-1,lock.writeLock().getHoldCount());
256 // }
257 // }
258
259 // /**
260 // * getReadHoldCount returns number of recursive holds
261 // */
262 // public void testGetReadHoldCount() { testGetReadHoldCount(false); }
263 // public void testGetReadHoldCount_fair() { testGetReadHoldCount(true); }
264 // public void testGetReadHoldCount(boolean fair) {
265 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
266 // for (int i = 1; i <= SIZE; i++) {
267 // lock.readLock().lock();
268 // assertEquals(i,lock.getReadHoldCount());
269 // }
270 // for (int i = SIZE; i > 0; i--) {
271 // lock.readLock().unlock();
272 // assertEquals(i-1,lock.getReadHoldCount());
273 // }
274 // }
275
276 // /**
277 // * write-unlocking an unlocked lock throws IllegalMonitorStateException
278 // */
279 // public void testWriteUnlock_IMSE() { testWriteUnlock_IMSE(false); }
280 // public void testWriteUnlock_IMSE_fair() { testWriteUnlock_IMSE(true); }
281 // public void testWriteUnlock_IMSE(boolean fair) {
282 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
283 // try {
284 // lock.writeLock().unlock();
285 // shouldThrow();
286 // } catch (IllegalMonitorStateException success) {}
287 // }
288
289 // /**
290 // * read-unlocking an unlocked lock throws IllegalMonitorStateException
291 // */
292 // public void testReadUnlock_IMSE() { testReadUnlock_IMSE(false); }
293 // public void testReadUnlock_IMSE_fair() { testReadUnlock_IMSE(true); }
294 // public void testReadUnlock_IMSE(boolean fair) {
295 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
296 // try {
297 // lock.readLock().unlock();
298 // shouldThrow();
299 // } catch (IllegalMonitorStateException success) {}
300 // }
301
302 // /**
303 // * write-lockInterruptibly is interruptible
304 // */
305 // public void testWriteLockInterruptibly_Interruptible() { testWriteLockInterruptibly_Interruptible(false); }
306 // public void testWriteLockInterruptibly_Interruptible_fair() { testWriteLockInterruptibly_Interruptible(true); }
307 // public void testWriteLockInterruptibly_Interruptible(boolean fair) {
308 // final PublicReentrantReadWriteLock lock =
309 // new PublicReentrantReadWriteLock(fair);
310 // lock.writeLock().lock();
311 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
312 // public void realRun() throws InterruptedException {
313 // lock.writeLock().lockInterruptibly();
314 // }});
315
316 // waitForQueuedThread(lock, t);
317 // t.interrupt();
318 // awaitTermination(t);
319 // releaseWriteLock(lock);
320 // }
321
322 // /**
323 // * timed write-tryLock is interruptible
324 // */
325 // public void testWriteTryLock_Interruptible() { testWriteTryLock_Interruptible(false); }
326 // public void testWriteTryLock_Interruptible_fair() { testWriteTryLock_Interruptible(true); }
327 // public void testWriteTryLock_Interruptible(boolean fair) {
328 // final PublicReentrantReadWriteLock lock =
329 // new PublicReentrantReadWriteLock(fair);
330 // lock.writeLock().lock();
331 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
332 // public void realRun() throws InterruptedException {
333 // lock.writeLock().tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
334 // }});
335
336 // waitForQueuedThread(lock, t);
337 // t.interrupt();
338 // awaitTermination(t);
339 // releaseWriteLock(lock);
340 // }
341
342 // /**
343 // * read-lockInterruptibly is interruptible
344 // */
345 // public void testReadLockInterruptibly_Interruptible() { testReadLockInterruptibly_Interruptible(false); }
346 // public void testReadLockInterruptibly_Interruptible_fair() { testReadLockInterruptibly_Interruptible(true); }
347 // public void testReadLockInterruptibly_Interruptible(boolean fair) {
348 // final PublicReentrantReadWriteLock lock =
349 // new PublicReentrantReadWriteLock(fair);
350 // lock.writeLock().lock();
351 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
352 // public void realRun() throws InterruptedException {
353 // lock.readLock().lockInterruptibly();
354 // }});
355
356 // waitForQueuedThread(lock, t);
357 // t.interrupt();
358 // awaitTermination(t);
359 // releaseWriteLock(lock);
360 // }
361
362 // /**
363 // * timed read-tryLock is interruptible
364 // */
365 // public void testReadTryLock_Interruptible() { testReadTryLock_Interruptible(false); }
366 // public void testReadTryLock_Interruptible_fair() { testReadTryLock_Interruptible(true); }
367 // public void testReadTryLock_Interruptible(boolean fair) {
368 // final PublicReentrantReadWriteLock lock =
369 // new PublicReentrantReadWriteLock(fair);
370 // lock.writeLock().lock();
371 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
372 // public void realRun() throws InterruptedException {
373 // lock.readLock().tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
374 // }});
375
376 // waitForQueuedThread(lock, t);
377 // t.interrupt();
378 // awaitTermination(t);
379 // releaseWriteLock(lock);
380 // }
381
382 // /**
383 // * write-tryLock on an unlocked lock succeeds
384 // */
385 // public void testWriteTryLock() { testWriteTryLock(false); }
386 // public void testWriteTryLock_fair() { testWriteTryLock(true); }
387 // public void testWriteTryLock(boolean fair) {
388 // final PublicReentrantReadWriteLock lock =
389 // new PublicReentrantReadWriteLock(fair);
390 // assertTrue(lock.writeLock().tryLock());
391 // assertWriteLockedByMoi(lock);
392 // assertTrue(lock.writeLock().tryLock());
393 // assertWriteLockedByMoi(lock);
394 // lock.writeLock().unlock();
395 // releaseWriteLock(lock);
396 // }
397
398 // /**
399 // * write-tryLock fails if locked
400 // */
401 // public void testWriteTryLockWhenLocked() { testWriteTryLockWhenLocked(false); }
402 // public void testWriteTryLockWhenLocked_fair() { testWriteTryLockWhenLocked(true); }
403 // public void testWriteTryLockWhenLocked(boolean fair) {
404 // final PublicReentrantReadWriteLock lock =
405 // new PublicReentrantReadWriteLock(fair);
406 // lock.writeLock().lock();
407 // Thread t = newStartedThread(new CheckedRunnable() {
408 // public void realRun() {
409 // assertFalse(lock.writeLock().tryLock());
410 // }});
411
412 // awaitTermination(t);
413 // releaseWriteLock(lock);
414 // }
415
416 // /**
417 // * read-tryLock fails if locked
418 // */
419 // public void testReadTryLockWhenLocked() { testReadTryLockWhenLocked(false); }
420 // public void testReadTryLockWhenLocked_fair() { testReadTryLockWhenLocked(true); }
421 // public void testReadTryLockWhenLocked(boolean fair) {
422 // final PublicReentrantReadWriteLock lock =
423 // new PublicReentrantReadWriteLock(fair);
424 // lock.writeLock().lock();
425 // Thread t = newStartedThread(new CheckedRunnable() {
426 // public void realRun() {
427 // assertFalse(lock.readLock().tryLock());
428 // }});
429
430 // awaitTermination(t);
431 // releaseWriteLock(lock);
432 // }
433
434 // /**
435 // * Multiple threads can hold a read lock when not write-locked
436 // */
437 // public void testMultipleReadLocks() { testMultipleReadLocks(false); }
438 // public void testMultipleReadLocks_fair() { testMultipleReadLocks(true); }
439 // public void testMultipleReadLocks(boolean fair) {
440 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
441 // lock.readLock().lock();
442 // Thread t = newStartedThread(new CheckedRunnable() {
443 // public void realRun() throws InterruptedException {
444 // assertTrue(lock.readLock().tryLock());
445 // lock.readLock().unlock();
446 // assertTrue(lock.readLock().tryLock(LONG_DELAY_MS, MILLISECONDS));
447 // lock.readLock().unlock();
448 // lock.readLock().lock();
449 // lock.readLock().unlock();
450 // }});
451
452 // awaitTermination(t);
453 // lock.readLock().unlock();
454 // }
455
456 // /**
457 // * A writelock succeeds only after a reading thread unlocks
458 // */
459 // public void testWriteAfterReadLock() { testWriteAfterReadLock(false); }
460 // public void testWriteAfterReadLock_fair() { testWriteAfterReadLock(true); }
461 // public void testWriteAfterReadLock(boolean fair) {
462 // final PublicReentrantReadWriteLock lock =
463 // new PublicReentrantReadWriteLock(fair);
464 // lock.readLock().lock();
465 // Thread t = newStartedThread(new CheckedRunnable() {
466 // public void realRun() {
467 // assertEquals(1, lock.getReadLockCount());
468 // lock.writeLock().lock();
469 // assertEquals(0, lock.getReadLockCount());
470 // lock.writeLock().unlock();
471 // }});
472 // waitForQueuedThread(lock, t);
473 // assertNotWriteLocked(lock);
474 // assertEquals(1, lock.getReadLockCount());
475 // lock.readLock().unlock();
476 // assertEquals(0, lock.getReadLockCount());
477 // awaitTermination(t);
478 // assertNotWriteLocked(lock);
479 // }
480
481 // /**
482 // * A writelock succeeds only after reading threads unlock
483 // */
484 // public void testWriteAfterMultipleReadLocks() { testWriteAfterMultipleReadLocks(false); }
485 // public void testWriteAfterMultipleReadLocks_fair() { testWriteAfterMultipleReadLocks(true); }
486 // public void testWriteAfterMultipleReadLocks(boolean fair) {
487 // final PublicReentrantReadWriteLock lock =
488 // new PublicReentrantReadWriteLock(fair);
489 // lock.readLock().lock();
490 // lock.readLock().lock();
491 // Thread t1 = newStartedThread(new CheckedRunnable() {
492 // public void realRun() {
493 // lock.readLock().lock();
494 // assertEquals(3, lock.getReadLockCount());
495 // lock.readLock().unlock();
496 // }});
497 // awaitTermination(t1);
498
499 // Thread t2 = newStartedThread(new CheckedRunnable() {
500 // public void realRun() {
501 // assertEquals(2, lock.getReadLockCount());
502 // lock.writeLock().lock();
503 // assertEquals(0, lock.getReadLockCount());
504 // lock.writeLock().unlock();
505 // }});
506 // waitForQueuedThread(lock, t2);
507 // assertNotWriteLocked(lock);
508 // assertEquals(2, lock.getReadLockCount());
509 // lock.readLock().unlock();
510 // lock.readLock().unlock();
511 // assertEquals(0, lock.getReadLockCount());
512 // awaitTermination(t2);
513 // assertNotWriteLocked(lock);
514 // }
515
516 // /**
517 // * A thread that tries to acquire a fair read lock (non-reentrantly)
518 // * will block if there is a waiting writer thread
519 // */
520 // public void testReaderWriterReaderFairFifo() {
521 // final PublicReentrantReadWriteLock lock =
522 // new PublicReentrantReadWriteLock(true);
523 // final AtomicBoolean t1GotLock = new AtomicBoolean(false);
524
525 // lock.readLock().lock();
526 // Thread t1 = newStartedThread(new CheckedRunnable() {
527 // public void realRun() {
528 // assertEquals(1, lock.getReadLockCount());
529 // lock.writeLock().lock();
530 // assertEquals(0, lock.getReadLockCount());
531 // t1GotLock.set(true);
532 // lock.writeLock().unlock();
533 // }});
534 // waitForQueuedThread(lock, t1);
535
536 // Thread t2 = newStartedThread(new CheckedRunnable() {
537 // public void realRun() {
538 // assertEquals(1, lock.getReadLockCount());
539 // lock.readLock().lock();
540 // assertEquals(1, lock.getReadLockCount());
541 // assertTrue(t1GotLock.get());
542 // lock.readLock().unlock();
543 // }});
544 // waitForQueuedThread(lock, t2);
545 // assertTrue(t1.isAlive());
546 // assertNotWriteLocked(lock);
547 // assertEquals(1, lock.getReadLockCount());
548 // lock.readLock().unlock();
549 // awaitTermination(t1);
550 // awaitTermination(t2);
551 // assertNotWriteLocked(lock);
552 // }
553
554 // /**
555 // * Readlocks succeed only after a writing thread unlocks
556 // */
557 // public void testReadAfterWriteLock() { testReadAfterWriteLock(false); }
558 // public void testReadAfterWriteLock_fair() { testReadAfterWriteLock(true); }
559 // public void testReadAfterWriteLock(boolean fair) {
560 // final PublicReentrantReadWriteLock lock =
561 // new PublicReentrantReadWriteLock(fair);
562 // lock.writeLock().lock();
563 // Thread t1 = newStartedThread(new CheckedRunnable() {
564 // public void realRun() {
565 // lock.readLock().lock();
566 // lock.readLock().unlock();
567 // }});
568 // Thread t2 = newStartedThread(new CheckedRunnable() {
569 // public void realRun() {
570 // lock.readLock().lock();
571 // lock.readLock().unlock();
572 // }});
573
574 // waitForQueuedThread(lock, t1);
575 // waitForQueuedThread(lock, t2);
576 // releaseWriteLock(lock);
577 // awaitTermination(t1);
578 // awaitTermination(t2);
579 // }
580
581 // /**
582 // * Read trylock succeeds if write locked by current thread
583 // */
584 // public void testReadHoldingWriteLock() { testReadHoldingWriteLock(false); }
585 // public void testReadHoldingWriteLock_fair() { testReadHoldingWriteLock(true); }
586 // public void testReadHoldingWriteLock(boolean fair) {
587 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
588 // lock.writeLock().lock();
589 // assertTrue(lock.readLock().tryLock());
590 // lock.readLock().unlock();
591 // lock.writeLock().unlock();
592 // }
593
594 // /**
595 // * Read trylock succeeds (barging) even in the presence of waiting
596 // * readers and/or writers
597 // */
598 // public void testReadTryLockBarging() { testReadTryLockBarging(false); }
599 // public void testReadTryLockBarging_fair() { testReadTryLockBarging(true); }
600 // public void testReadTryLockBarging(boolean fair) {
601 // final PublicReentrantReadWriteLock lock =
602 // new PublicReentrantReadWriteLock(fair);
603 // lock.readLock().lock();
604
605 // Thread t1 = newStartedThread(new CheckedRunnable() {
606 // public void realRun() {
607 // lock.writeLock().lock();
608 // lock.writeLock().unlock();
609 // }});
610
611 // waitForQueuedThread(lock, t1);
612
613 // Thread t2 = newStartedThread(new CheckedRunnable() {
614 // public void realRun() {
615 // lock.readLock().lock();
616 // lock.readLock().unlock();
617 // }});
618
619 // if (fair)
620 // waitForQueuedThread(lock, t2);
621
622 // Thread t3 = newStartedThread(new CheckedRunnable() {
623 // public void realRun() {
624 // lock.readLock().tryLock();
625 // lock.readLock().unlock();
626 // }});
627
628 // assertTrue(lock.getReadLockCount() > 0);
629 // awaitTermination(t3);
630 // assertTrue(t1.isAlive());
631 // if (fair) assertTrue(t2.isAlive());
632 // lock.readLock().unlock();
633 // awaitTermination(t1);
634 // awaitTermination(t2);
635 // }
636
637 // /**
638 // * Read lock succeeds if write locked by current thread even if
639 // * other threads are waiting for readlock
640 // */
641 // public void testReadHoldingWriteLock2() { testReadHoldingWriteLock2(false); }
642 // public void testReadHoldingWriteLock2_fair() { testReadHoldingWriteLock2(true); }
643 // public void testReadHoldingWriteLock2(boolean fair) {
644 // final PublicReentrantReadWriteLock lock =
645 // new PublicReentrantReadWriteLock(fair);
646 // lock.writeLock().lock();
647 // lock.readLock().lock();
648 // lock.readLock().unlock();
649
650 // Thread t1 = newStartedThread(new CheckedRunnable() {
651 // public void realRun() {
652 // lock.readLock().lock();
653 // lock.readLock().unlock();
654 // }});
655 // Thread t2 = newStartedThread(new CheckedRunnable() {
656 // public void realRun() {
657 // lock.readLock().lock();
658 // lock.readLock().unlock();
659 // }});
660
661 // waitForQueuedThread(lock, t1);
662 // waitForQueuedThread(lock, t2);
663 // assertWriteLockedByMoi(lock);
664 // lock.readLock().lock();
665 // lock.readLock().unlock();
666 // releaseWriteLock(lock);
667 // awaitTermination(t1);
668 // awaitTermination(t2);
669 // }
670
671 // /**
672 // * Read lock succeeds if write locked by current thread even if
673 // * other threads are waiting for writelock
674 // */
675 // public void testReadHoldingWriteLock3() { testReadHoldingWriteLock3(false); }
676 // public void testReadHoldingWriteLock3_fair() { testReadHoldingWriteLock3(true); }
677 // public void testReadHoldingWriteLock3(boolean fair) {
678 // final PublicReentrantReadWriteLock lock =
679 // new PublicReentrantReadWriteLock(fair);
680 // lock.writeLock().lock();
681 // lock.readLock().lock();
682 // lock.readLock().unlock();
683
684 // Thread t1 = newStartedThread(new CheckedRunnable() {
685 // public void realRun() {
686 // lock.writeLock().lock();
687 // lock.writeLock().unlock();
688 // }});
689 // Thread t2 = newStartedThread(new CheckedRunnable() {
690 // public void realRun() {
691 // lock.writeLock().lock();
692 // lock.writeLock().unlock();
693 // }});
694
695 // waitForQueuedThread(lock, t1);
696 // waitForQueuedThread(lock, t2);
697 // assertWriteLockedByMoi(lock);
698 // lock.readLock().lock();
699 // lock.readLock().unlock();
700 // assertWriteLockedByMoi(lock);
701 // lock.writeLock().unlock();
702 // awaitTermination(t1);
703 // awaitTermination(t2);
704 // }
705
706 // /**
707 // * Write lock succeeds if write locked by current thread even if
708 // * other threads are waiting for writelock
709 // */
710 // public void testWriteHoldingWriteLock4() { testWriteHoldingWriteLock4(false); }
711 // public void testWriteHoldingWriteLock4_fair() { testWriteHoldingWriteLock4(true); }
712 // public void testWriteHoldingWriteLock4(boolean fair) {
713 // final PublicReentrantReadWriteLock lock =
714 // new PublicReentrantReadWriteLock(fair);
715 // lock.writeLock().lock();
716 // lock.writeLock().lock();
717 // lock.writeLock().unlock();
718
719 // Thread t1 = newStartedThread(new CheckedRunnable() {
720 // public void realRun() {
721 // lock.writeLock().lock();
722 // lock.writeLock().unlock();
723 // }});
724 // Thread t2 = newStartedThread(new CheckedRunnable() {
725 // public void realRun() {
726 // lock.writeLock().lock();
727 // lock.writeLock().unlock();
728 // }});
729
730 // waitForQueuedThread(lock, t1);
731 // waitForQueuedThread(lock, t2);
732 // assertWriteLockedByMoi(lock);
733 // assertEquals(1, lock.getWriteHoldCount());
734 // lock.writeLock().lock();
735 // assertWriteLockedByMoi(lock);
736 // assertEquals(2, lock.getWriteHoldCount());
737 // lock.writeLock().unlock();
738 // assertWriteLockedByMoi(lock);
739 // assertEquals(1, lock.getWriteHoldCount());
740 // lock.writeLock().unlock();
741 // awaitTermination(t1);
742 // awaitTermination(t2);
743 // }
744
745 // /**
746 // * Read tryLock succeeds if readlocked but not writelocked
747 // */
748 // public void testTryLockWhenReadLocked() { testTryLockWhenReadLocked(false); }
749 // public void testTryLockWhenReadLocked_fair() { testTryLockWhenReadLocked(true); }
750 // public void testTryLockWhenReadLocked(boolean fair) {
751 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
752 // lock.readLock().lock();
753 // Thread t = newStartedThread(new CheckedRunnable() {
754 // public void realRun() {
755 // assertTrue(lock.readLock().tryLock());
756 // lock.readLock().unlock();
757 // }});
758
759 // awaitTermination(t);
760 // lock.readLock().unlock();
761 // }
762
763 // /**
764 // * write tryLock fails when readlocked
765 // */
766 // public void testWriteTryLockWhenReadLocked() { testWriteTryLockWhenReadLocked(false); }
767 // public void testWriteTryLockWhenReadLocked_fair() { testWriteTryLockWhenReadLocked(true); }
768 // public void testWriteTryLockWhenReadLocked(boolean fair) {
769 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
770 // lock.readLock().lock();
771 // Thread t = newStartedThread(new CheckedRunnable() {
772 // public void realRun() {
773 // assertFalse(lock.writeLock().tryLock());
774 // }});
775
776 // awaitTermination(t);
777 // lock.readLock().unlock();
778 // }
779
780 // /**
781 // * write timed tryLock times out if locked
782 // */
783 // public void testWriteTryLock_Timeout() { testWriteTryLock_Timeout(false); }
784 // public void testWriteTryLock_Timeout_fair() { testWriteTryLock_Timeout(true); }
785 // public void testWriteTryLock_Timeout(boolean fair) {
786 // final PublicReentrantReadWriteLock lock =
787 // new PublicReentrantReadWriteLock(fair);
788 // lock.writeLock().lock();
789 // Thread t = newStartedThread(new CheckedRunnable() {
790 // public void realRun() throws InterruptedException {
791 // long startTime = System.nanoTime();
792 // long timeoutMillis = 10;
793 // assertFalse(lock.writeLock().tryLock(timeoutMillis, MILLISECONDS));
794 // assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
795 // }});
796
797 // awaitTermination(t);
798 // releaseWriteLock(lock);
799 // }
800
801 // /**
802 // * read timed tryLock times out if write-locked
803 // */
804 // public void testReadTryLock_Timeout() { testReadTryLock_Timeout(false); }
805 // public void testReadTryLock_Timeout_fair() { testReadTryLock_Timeout(true); }
806 // public void testReadTryLock_Timeout(boolean fair) {
807 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
808 // lock.writeLock().lock();
809 // Thread t = newStartedThread(new CheckedRunnable() {
810 // public void realRun() throws InterruptedException {
811 // long startTime = System.nanoTime();
812 // long timeoutMillis = 10;
813 // assertFalse(lock.readLock().tryLock(timeoutMillis, MILLISECONDS));
814 // assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
815 // }});
816
817 // awaitTermination(t);
818 // assertTrue(lock.writeLock().isHeldByCurrentThread());
819 // lock.writeLock().unlock();
820 // }
821
822 // /**
823 // * write lockInterruptibly succeeds if unlocked, else is interruptible
824 // */
825 // public void testWriteLockInterruptibly() { testWriteLockInterruptibly(false); }
826 // public void testWriteLockInterruptibly_fair() { testWriteLockInterruptibly(true); }
827 // public void testWriteLockInterruptibly(boolean fair) {
828 // final PublicReentrantReadWriteLock lock =
829 // new PublicReentrantReadWriteLock(fair);
830 // try {
831 // lock.writeLock().lockInterruptibly();
832 // } catch (InterruptedException ie) {
833 // threadUnexpectedException(ie);
834 // }
835 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
836 // public void realRun() throws InterruptedException {
837 // lock.writeLock().lockInterruptibly();
838 // }});
839
840 // waitForQueuedThread(lock, t);
841 // t.interrupt();
842 // assertTrue(lock.writeLock().isHeldByCurrentThread());
843 // awaitTermination(t);
844 // releaseWriteLock(lock);
845 // }
846
847 // /**
848 // * read lockInterruptibly succeeds if lock free else is interruptible
849 // */
850 // public void testReadLockInterruptibly() { testReadLockInterruptibly(false); }
851 // public void testReadLockInterruptibly_fair() { testReadLockInterruptibly(true); }
852 // public void testReadLockInterruptibly(boolean fair) {
853 // final PublicReentrantReadWriteLock lock =
854 // new PublicReentrantReadWriteLock(fair);
855 // try {
856 // lock.readLock().lockInterruptibly();
857 // lock.readLock().unlock();
858 // lock.writeLock().lockInterruptibly();
859 // } catch (InterruptedException ie) {
860 // threadUnexpectedException(ie);
861 // }
862 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
863 // public void realRun() throws InterruptedException {
864 // lock.readLock().lockInterruptibly();
865 // }});
866
867 // waitForQueuedThread(lock, t);
868 // t.interrupt();
869 // awaitTermination(t);
870 // releaseWriteLock(lock);
871 // }
872
873 // /**
874 // * Calling await without holding lock throws IllegalMonitorStateException
875 // */
876 // public void testAwait_IMSE() { testAwait_IMSE(false); }
877 // public void testAwait_IMSE_fair() { testAwait_IMSE(true); }
878 // public void testAwait_IMSE(boolean fair) {
879 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
880 // final Condition c = lock.writeLock().newCondition();
881 // for (AwaitMethod awaitMethod : AwaitMethod.values()) {
882 // long startTime = System.nanoTime();
883 // try {
884 // await(c, awaitMethod);
885 // shouldThrow();
886 // } catch (IllegalMonitorStateException success) {
887 // } catch (InterruptedException e) { threadUnexpectedException(e); }
888 // assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
889 // }
890 // }
891
892 // /**
893 // * Calling signal without holding lock throws IllegalMonitorStateException
894 // */
895 // public void testSignal_IMSE() { testSignal_IMSE(false); }
896 // public void testSignal_IMSE_fair() { testSignal_IMSE(true); }
897 // public void testSignal_IMSE(boolean fair) {
898 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
899 // final Condition c = lock.writeLock().newCondition();
900 // try {
901 // c.signal();
902 // shouldThrow();
903 // } catch (IllegalMonitorStateException success) {}
904 // }
905
906 // /**
907 // * Calling signalAll without holding lock throws IllegalMonitorStateException
908 // */
909 // public void testSignalAll_IMSE() { testSignalAll_IMSE(false); }
910 // public void testSignalAll_IMSE_fair() { testSignalAll_IMSE(true); }
911 // public void testSignalAll_IMSE(boolean fair) {
912 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
913 // final Condition c = lock.writeLock().newCondition();
914 // try {
915 // c.signalAll();
916 // shouldThrow();
917 // } catch (IllegalMonitorStateException success) {}
918 // }
919
920 // /**
921 // * awaitNanos without a signal times out
922 // */
923 // public void testAwaitNanos_Timeout() { testAwaitNanos_Timeout(false); }
924 // public void testAwaitNanos_Timeout_fair() { testAwaitNanos_Timeout(true); }
925 // public void testAwaitNanos_Timeout(boolean fair) {
926 // try {
927 // final ReentrantReadWriteLock lock =
928 // new ReentrantReadWriteLock(fair);
929 // final Condition c = lock.writeLock().newCondition();
930 // lock.writeLock().lock();
931 // long startTime = System.nanoTime();
932 // long timeoutMillis = 10;
933 // long timeoutNanos = MILLISECONDS.toNanos(timeoutMillis);
934 // long nanosRemaining = c.awaitNanos(timeoutNanos);
935 // assertTrue(nanosRemaining <= 0);
936 // assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
937 // lock.writeLock().unlock();
938 // } catch (InterruptedException e) {
939 // threadUnexpectedException(e);
940 // }
941 // }
942
943 // /**
944 // * timed await without a signal times out
945 // */
946 // public void testAwait_Timeout() { testAwait_Timeout(false); }
947 // public void testAwait_Timeout_fair() { testAwait_Timeout(true); }
948 // public void testAwait_Timeout(boolean fair) {
949 // try {
950 // final ReentrantReadWriteLock lock =
951 // new ReentrantReadWriteLock(fair);
952 // final Condition c = lock.writeLock().newCondition();
953 // lock.writeLock().lock();
954 // long startTime = System.nanoTime();
955 // long timeoutMillis = 10;
956 // assertFalse(c.await(timeoutMillis, MILLISECONDS));
957 // assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
958 // lock.writeLock().unlock();
959 // } catch (InterruptedException e) {
960 // threadUnexpectedException(e);
961 // }
962 // }
963
964 // /**
965 // * awaitUntil without a signal times out
966 // */
967 // public void testAwaitUntil_Timeout() { testAwaitUntil_Timeout(false); }
968 // public void testAwaitUntil_Timeout_fair() { testAwaitUntil_Timeout(true); }
969 // public void testAwaitUntil_Timeout(boolean fair) {
970 // try {
971 // final ReentrantReadWriteLock lock =
972 // new ReentrantReadWriteLock(fair);
973 // final Condition c = lock.writeLock().newCondition();
974 // lock.writeLock().lock();
975 // long startTime = System.nanoTime();
976 // long timeoutMillis = 10;
977 // java.util.Date d = new java.util.Date();
978 // assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + timeoutMillis)));
979 // assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
980 // lock.writeLock().unlock();
981 // } catch (InterruptedException e) {
982 // threadUnexpectedException(e);
983 // }
984 // }
985
986 // /**
987 // * await returns when signalled
988 // */
989 // public void testAwait() { testAwait(false); }
990 // public void testAwait_fair() { testAwait(true); }
991 // public void testAwait(boolean fair) {
992 // final PublicReentrantReadWriteLock lock =
993 // new PublicReentrantReadWriteLock(fair);
994 // final Condition c = lock.writeLock().newCondition();
995 // final CountDownLatch locked = new CountDownLatch(1);
996 // Thread t = newStartedThread(new CheckedRunnable() {
997 // public void realRun() throws InterruptedException {
998 // lock.writeLock().lock();
999 // locked.countDown();
1000 // c.await();
1001 // lock.writeLock().unlock();
1002 // }});
1003
1004 // await(locked);
1005 // lock.writeLock().lock();
1006 // assertHasWaiters(lock, c, t);
1007 // c.signal();
1008 // assertHasNoWaiters(lock, c);
1009 // assertTrue(t.isAlive());
1010 // lock.writeLock().unlock();
1011 // awaitTermination(t);
1012 // }
1013
1014 // /**
1015 // * awaitUninterruptibly is uninterruptible
1016 // */
1017 // public void testAwaitUninterruptibly() { testAwaitUninterruptibly(false); }
1018 // public void testAwaitUninterruptibly_fair() { testAwaitUninterruptibly(true); }
1019 // public void testAwaitUninterruptibly(boolean fair) {
1020 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1021 // final Condition c = lock.writeLock().newCondition();
1022 // final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
1023
1024 // Thread t1 = newStartedThread(new CheckedRunnable() {
1025 // public void realRun() {
1026 // // Interrupt before awaitUninterruptibly
1027 // lock.writeLock().lock();
1028 // pleaseInterrupt.countDown();
1029 // Thread.currentThread().interrupt();
1030 // c.awaitUninterruptibly();
1031 // assertTrue(Thread.interrupted());
1032 // lock.writeLock().unlock();
1033 // }});
1034
1035 // Thread t2 = newStartedThread(new CheckedRunnable() {
1036 // public void realRun() {
1037 // // Interrupt during awaitUninterruptibly
1038 // lock.writeLock().lock();
1039 // pleaseInterrupt.countDown();
1040 // c.awaitUninterruptibly();
1041 // assertTrue(Thread.interrupted());
1042 // lock.writeLock().unlock();
1043 // }});
1044
1045 // await(pleaseInterrupt);
1046 // lock.writeLock().lock();
1047 // lock.writeLock().unlock();
1048 // t2.interrupt();
1049
1050 // assertThreadStaysAlive(t1);
1051 // assertTrue(t2.isAlive());
1052
1053 // lock.writeLock().lock();
1054 // c.signalAll();
1055 // lock.writeLock().unlock();
1056
1057 // awaitTermination(t1);
1058 // awaitTermination(t2);
1059 // }
1060
1061 // /**
1062 // * await/awaitNanos/awaitUntil is interruptible
1063 // */
1064 // public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); }
1065 // public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); }
1066 // public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); }
1067 // public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); }
1068 // public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); }
1069 // public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); }
1070 // public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); }
1071 // public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); }
1072 // public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) {
1073 // final PublicReentrantReadWriteLock lock =
1074 // new PublicReentrantReadWriteLock(fair);
1075 // final Condition c = lock.writeLock().newCondition();
1076 // final CountDownLatch locked = new CountDownLatch(1);
1077 // Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1078 // public void realRun() throws InterruptedException {
1079 // lock.writeLock().lock();
1080 // assertWriteLockedByMoi(lock);
1081 // assertHasNoWaiters(lock, c);
1082 // locked.countDown();
1083 // try {
1084 // await(c, awaitMethod);
1085 // } finally {
1086 // assertWriteLockedByMoi(lock);
1087 // assertHasNoWaiters(lock, c);
1088 // lock.writeLock().unlock();
1089 // assertFalse(Thread.interrupted());
1090 // }
1091 // }});
1092
1093 // await(locked);
1094 // assertHasWaiters(lock, c, t);
1095 // t.interrupt();
1096 // awaitTermination(t);
1097 // assertNotWriteLocked(lock);
1098 // }
1099
1100 // /**
1101 // * signalAll wakes up all threads
1102 // */
1103 // public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); }
1104 // public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); }
1105 // public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); }
1106 // public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); }
1107 // public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); }
1108 // public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); }
1109 // public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); }
1110 // public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); }
1111 // public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) {
1112 // final PublicReentrantReadWriteLock lock =
1113 // new PublicReentrantReadWriteLock(fair);
1114 // final Condition c = lock.writeLock().newCondition();
1115 // final CountDownLatch locked = new CountDownLatch(2);
1116 // final Lock writeLock = lock.writeLock();
1117 // class Awaiter extends CheckedRunnable {
1118 // public void realRun() throws InterruptedException {
1119 // writeLock.lock();
1120 // locked.countDown();
1121 // await(c, awaitMethod);
1122 // writeLock.unlock();
1123 // }
1124 // }
1125
1126 // Thread t1 = newStartedThread(new Awaiter());
1127 // Thread t2 = newStartedThread(new Awaiter());
1128
1129 // await(locked);
1130 // writeLock.lock();
1131 // assertHasWaiters(lock, c, t1, t2);
1132 // c.signalAll();
1133 // assertHasNoWaiters(lock, c);
1134 // writeLock.unlock();
1135 // awaitTermination(t1);
1136 // awaitTermination(t2);
1137 // }
1138
1139 // /**
1140 // * signal wakes up waiting threads in FIFO order
1141 // */
1142 // public void testSignalWakesFifo() { testSignalWakesFifo(false); }
1143 // public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); }
1144 // public void testSignalWakesFifo(boolean fair) {
1145 // final PublicReentrantReadWriteLock lock =
1146 // new PublicReentrantReadWriteLock(fair);
1147 // final Condition c = lock.writeLock().newCondition();
1148 // final CountDownLatch locked1 = new CountDownLatch(1);
1149 // final CountDownLatch locked2 = new CountDownLatch(1);
1150 // final Lock writeLock = lock.writeLock();
1151 // Thread t1 = newStartedThread(new CheckedRunnable() {
1152 // public void realRun() throws InterruptedException {
1153 // writeLock.lock();
1154 // locked1.countDown();
1155 // c.await();
1156 // writeLock.unlock();
1157 // }});
1158
1159 // await(locked1);
1160
1161 // Thread t2 = newStartedThread(new CheckedRunnable() {
1162 // public void realRun() throws InterruptedException {
1163 // writeLock.lock();
1164 // locked2.countDown();
1165 // c.await();
1166 // writeLock.unlock();
1167 // }});
1168
1169 // await(locked2);
1170
1171 // writeLock.lock();
1172 // assertHasWaiters(lock, c, t1, t2);
1173 // assertFalse(lock.hasQueuedThreads());
1174 // c.signal();
1175 // assertHasWaiters(lock, c, t2);
1176 // assertTrue(lock.hasQueuedThread(t1));
1177 // assertFalse(lock.hasQueuedThread(t2));
1178 // c.signal();
1179 // assertHasNoWaiters(lock, c);
1180 // assertTrue(lock.hasQueuedThread(t1));
1181 // assertTrue(lock.hasQueuedThread(t2));
1182 // writeLock.unlock();
1183 // awaitTermination(t1);
1184 // awaitTermination(t2);
1185 // }
1186
1187 // /**
1188 // * await after multiple reentrant locking preserves lock count
1189 // */
1190 // public void testAwaitLockCount() { testAwaitLockCount(false); }
1191 // public void testAwaitLockCount_fair() { testAwaitLockCount(true); }
1192 // public void testAwaitLockCount(boolean fair) {
1193 // final PublicReentrantReadWriteLock lock =
1194 // new PublicReentrantReadWriteLock(fair);
1195 // final Condition c = lock.writeLock().newCondition();
1196 // final CountDownLatch locked = new CountDownLatch(2);
1197 // Thread t1 = newStartedThread(new CheckedRunnable() {
1198 // public void realRun() throws InterruptedException {
1199 // lock.writeLock().lock();
1200 // assertWriteLockedByMoi(lock);
1201 // assertEquals(1, lock.writeLock().getHoldCount());
1202 // locked.countDown();
1203 // c.await();
1204 // assertWriteLockedByMoi(lock);
1205 // assertEquals(1, lock.writeLock().getHoldCount());
1206 // lock.writeLock().unlock();
1207 // }});
1208
1209 // Thread t2 = newStartedThread(new CheckedRunnable() {
1210 // public void realRun() throws InterruptedException {
1211 // lock.writeLock().lock();
1212 // lock.writeLock().lock();
1213 // assertWriteLockedByMoi(lock);
1214 // assertEquals(2, lock.writeLock().getHoldCount());
1215 // locked.countDown();
1216 // c.await();
1217 // assertWriteLockedByMoi(lock);
1218 // assertEquals(2, lock.writeLock().getHoldCount());
1219 // lock.writeLock().unlock();
1220 // lock.writeLock().unlock();
1221 // }});
1222
1223 // await(locked);
1224 // lock.writeLock().lock();
1225 // assertHasWaiters(lock, c, t1, t2);
1226 // c.signalAll();
1227 // assertHasNoWaiters(lock, c);
1228 // lock.writeLock().unlock();
1229 // awaitTermination(t1);
1230 // awaitTermination(t2);
1231 // }
1232
1233 // /**
1234 // * A serialized lock deserializes as unlocked
1235 // */
1236 // public void testSerialization() { testSerialization(false); }
1237 // public void testSerialization_fair() { testSerialization(true); }
1238 // public void testSerialization(boolean fair) {
1239 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1240 // lock.writeLock().lock();
1241 // lock.readLock().lock();
1242
1243 // ReentrantReadWriteLock clone = serialClone(lock);
1244 // assertEquals(lock.isFair(), clone.isFair());
1245 // assertTrue(lock.isWriteLocked());
1246 // assertFalse(clone.isWriteLocked());
1247 // assertEquals(1, lock.getReadLockCount());
1248 // assertEquals(0, clone.getReadLockCount());
1249 // clone.writeLock().lock();
1250 // clone.readLock().lock();
1251 // assertTrue(clone.isWriteLocked());
1252 // assertEquals(1, clone.getReadLockCount());
1253 // clone.readLock().unlock();
1254 // clone.writeLock().unlock();
1255 // assertFalse(clone.isWriteLocked());
1256 // assertEquals(1, lock.getReadLockCount());
1257 // assertEquals(0, clone.getReadLockCount());
1258 // }
1259
1260 // /**
1261 // * hasQueuedThreads reports whether there are waiting threads
1262 // */
1263 // public void testHasQueuedThreads() { testHasQueuedThreads(false); }
1264 // public void testHasQueuedThreads_fair() { testHasQueuedThreads(true); }
1265 // public void testHasQueuedThreads(boolean fair) {
1266 // final PublicReentrantReadWriteLock lock =
1267 // new PublicReentrantReadWriteLock(fair);
1268 // Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1269 // Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1270 // assertFalse(lock.hasQueuedThreads());
1271 // lock.writeLock().lock();
1272 // assertFalse(lock.hasQueuedThreads());
1273 // t1.start();
1274 // waitForQueuedThread(lock, t1);
1275 // assertTrue(lock.hasQueuedThreads());
1276 // t2.start();
1277 // waitForQueuedThread(lock, t2);
1278 // assertTrue(lock.hasQueuedThreads());
1279 // t1.interrupt();
1280 // awaitTermination(t1);
1281 // assertTrue(lock.hasQueuedThreads());
1282 // lock.writeLock().unlock();
1283 // awaitTermination(t2);
1284 // assertFalse(lock.hasQueuedThreads());
1285 // }
1286
1287 // /**
1288 // * hasQueuedThread(null) throws NPE
1289 // */
1290 // public void testHasQueuedThreadNPE() { testHasQueuedThreadNPE(false); }
1291 // public void testHasQueuedThreadNPE_fair() { testHasQueuedThreadNPE(true); }
1292 // public void testHasQueuedThreadNPE(boolean fair) {
1293 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1294 // try {
1295 // lock.hasQueuedThread(null);
1296 // shouldThrow();
1297 // } catch (NullPointerException success) {}
1298 // }
1299
1300 // /**
1301 // * hasQueuedThread reports whether a thread is queued
1302 // */
1303 // public void testHasQueuedThread() { testHasQueuedThread(false); }
1304 // public void testHasQueuedThread_fair() { testHasQueuedThread(true); }
1305 // public void testHasQueuedThread(boolean fair) {
1306 // final PublicReentrantReadWriteLock lock =
1307 // new PublicReentrantReadWriteLock(fair);
1308 // Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1309 // Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1310 // assertFalse(lock.hasQueuedThread(t1));
1311 // assertFalse(lock.hasQueuedThread(t2));
1312 // lock.writeLock().lock();
1313 // t1.start();
1314 // waitForQueuedThread(lock, t1);
1315 // assertTrue(lock.hasQueuedThread(t1));
1316 // assertFalse(lock.hasQueuedThread(t2));
1317 // t2.start();
1318 // waitForQueuedThread(lock, t2);
1319 // assertTrue(lock.hasQueuedThread(t1));
1320 // assertTrue(lock.hasQueuedThread(t2));
1321 // t1.interrupt();
1322 // awaitTermination(t1);
1323 // assertFalse(lock.hasQueuedThread(t1));
1324 // assertTrue(lock.hasQueuedThread(t2));
1325 // lock.writeLock().unlock();
1326 // awaitTermination(t2);
1327 // assertFalse(lock.hasQueuedThread(t1));
1328 // assertFalse(lock.hasQueuedThread(t2));
1329 // }
1330
1331 // /**
1332 // * getQueueLength reports number of waiting threads
1333 // */
1334 // public void testGetQueueLength() { testGetQueueLength(false); }
1335 // public void testGetQueueLength_fair() { testGetQueueLength(true); }
1336 // public void testGetQueueLength(boolean fair) {
1337 // final PublicReentrantReadWriteLock lock =
1338 // new PublicReentrantReadWriteLock(fair);
1339 // Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1340 // Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1341 // assertEquals(0, lock.getQueueLength());
1342 // lock.writeLock().lock();
1343 // t1.start();
1344 // waitForQueuedThread(lock, t1);
1345 // assertEquals(1, lock.getQueueLength());
1346 // t2.start();
1347 // waitForQueuedThread(lock, t2);
1348 // assertEquals(2, lock.getQueueLength());
1349 // t1.interrupt();
1350 // awaitTermination(t1);
1351 // assertEquals(1, lock.getQueueLength());
1352 // lock.writeLock().unlock();
1353 // awaitTermination(t2);
1354 // assertEquals(0, lock.getQueueLength());
1355 // }
1356
1357 // /**
1358 // * getQueuedThreads includes waiting threads
1359 // */
1360 // public void testGetQueuedThreads() { testGetQueuedThreads(false); }
1361 // public void testGetQueuedThreads_fair() { testGetQueuedThreads(true); }
1362 // public void testGetQueuedThreads(boolean fair) {
1363 // final PublicReentrantReadWriteLock lock =
1364 // new PublicReentrantReadWriteLock(fair);
1365 // Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1366 // Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1367 // assertTrue(lock.getQueuedThreads().isEmpty());
1368 // lock.writeLock().lock();
1369 // assertTrue(lock.getQueuedThreads().isEmpty());
1370 // t1.start();
1371 // waitForQueuedThread(lock, t1);
1372 // assertEquals(1, lock.getQueuedThreads().size());
1373 // assertTrue(lock.getQueuedThreads().contains(t1));
1374 // t2.start();
1375 // waitForQueuedThread(lock, t2);
1376 // assertEquals(2, lock.getQueuedThreads().size());
1377 // assertTrue(lock.getQueuedThreads().contains(t1));
1378 // assertTrue(lock.getQueuedThreads().contains(t2));
1379 // t1.interrupt();
1380 // awaitTermination(t1);
1381 // assertFalse(lock.getQueuedThreads().contains(t1));
1382 // assertTrue(lock.getQueuedThreads().contains(t2));
1383 // assertEquals(1, lock.getQueuedThreads().size());
1384 // lock.writeLock().unlock();
1385 // awaitTermination(t2);
1386 // assertTrue(lock.getQueuedThreads().isEmpty());
1387 // }
1388
1389 // /**
1390 // * hasWaiters throws NPE if null
1391 // */
1392 // public void testHasWaitersNPE() { testHasWaitersNPE(false); }
1393 // public void testHasWaitersNPE_fair() { testHasWaitersNPE(true); }
1394 // public void testHasWaitersNPE(boolean fair) {
1395 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1396 // try {
1397 // lock.hasWaiters(null);
1398 // shouldThrow();
1399 // } catch (NullPointerException success) {}
1400 // }
1401
1402 // /**
1403 // * getWaitQueueLength throws NPE if null
1404 // */
1405 // public void testGetWaitQueueLengthNPE() { testGetWaitQueueLengthNPE(false); }
1406 // public void testGetWaitQueueLengthNPE_fair() { testGetWaitQueueLengthNPE(true); }
1407 // public void testGetWaitQueueLengthNPE(boolean fair) {
1408 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1409 // try {
1410 // lock.getWaitQueueLength(null);
1411 // shouldThrow();
1412 // } catch (NullPointerException success) {}
1413 // }
1414
1415 // /**
1416 // * getWaitingThreads throws NPE if null
1417 // */
1418 // public void testGetWaitingThreadsNPE() { testGetWaitingThreadsNPE(false); }
1419 // public void testGetWaitingThreadsNPE_fair() { testGetWaitingThreadsNPE(true); }
1420 // public void testGetWaitingThreadsNPE(boolean fair) {
1421 // final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock(fair);
1422 // try {
1423 // lock.getWaitingThreads(null);
1424 // shouldThrow();
1425 // } catch (NullPointerException success) {}
1426 // }
1427
1428 // /**
1429 // * hasWaiters throws IllegalArgumentException if not owned
1430 // */
1431 // public void testHasWaitersIAE() { testHasWaitersIAE(false); }
1432 // public void testHasWaitersIAE_fair() { testHasWaitersIAE(true); }
1433 // public void testHasWaitersIAE(boolean fair) {
1434 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1435 // final Condition c = lock.writeLock().newCondition();
1436 // final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1437 // try {
1438 // lock2.hasWaiters(c);
1439 // shouldThrow();
1440 // } catch (IllegalArgumentException success) {}
1441 // }
1442
1443 // /**
1444 // * hasWaiters throws IllegalMonitorStateException if not locked
1445 // */
1446 // public void testHasWaitersIMSE() { testHasWaitersIMSE(false); }
1447 // public void testHasWaitersIMSE_fair() { testHasWaitersIMSE(true); }
1448 // public void testHasWaitersIMSE(boolean fair) {
1449 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1450 // final Condition c = lock.writeLock().newCondition();
1451 // try {
1452 // lock.hasWaiters(c);
1453 // shouldThrow();
1454 // } catch (IllegalMonitorStateException success) {}
1455 // }
1456
1457 // /**
1458 // * getWaitQueueLength throws IllegalArgumentException if not owned
1459 // */
1460 // public void testGetWaitQueueLengthIAE() { testGetWaitQueueLengthIAE(false); }
1461 // public void testGetWaitQueueLengthIAE_fair() { testGetWaitQueueLengthIAE(true); }
1462 // public void testGetWaitQueueLengthIAE(boolean fair) {
1463 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1464 // final Condition c = lock.writeLock().newCondition();
1465 // final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1466 // try {
1467 // lock2.getWaitQueueLength(c);
1468 // shouldThrow();
1469 // } catch (IllegalArgumentException success) {}
1470 // }
1471
1472 // /**
1473 // * getWaitQueueLength throws IllegalMonitorStateException if not locked
1474 // */
1475 // public void testGetWaitQueueLengthIMSE() { testGetWaitQueueLengthIMSE(false); }
1476 // public void testGetWaitQueueLengthIMSE_fair() { testGetWaitQueueLengthIMSE(true); }
1477 // public void testGetWaitQueueLengthIMSE(boolean fair) {
1478 // final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1479 // final Condition c = lock.writeLock().newCondition();
1480 // try {
1481 // lock.getWaitQueueLength(c);
1482 // shouldThrow();
1483 // } catch (IllegalMonitorStateException success) {}
1484 // }
1485
1486 // /**
1487 // * getWaitingThreads throws IllegalArgumentException if not owned
1488 // */
1489 // public void testGetWaitingThreadsIAE() { testGetWaitingThreadsIAE(false); }
1490 // public void testGetWaitingThreadsIAE_fair() { testGetWaitingThreadsIAE(true); }
1491 // public void testGetWaitingThreadsIAE(boolean fair) {
1492 // final PublicReentrantReadWriteLock lock =
1493 // new PublicReentrantReadWriteLock(fair);
1494 // final Condition c = lock.writeLock().newCondition();
1495 // final PublicReentrantReadWriteLock lock2 =
1496 // new PublicReentrantReadWriteLock(fair);
1497 // try {
1498 // lock2.getWaitingThreads(c);
1499 // shouldThrow();
1500 // } catch (IllegalArgumentException success) {}
1501 // }
1502
1503 // /**
1504 // * getWaitingThreads throws IllegalMonitorStateException if not locked
1505 // */
1506 // public void testGetWaitingThreadsIMSE() { testGetWaitingThreadsIMSE(false); }
1507 // public void testGetWaitingThreadsIMSE_fair() { testGetWaitingThreadsIMSE(true); }
1508 // public void testGetWaitingThreadsIMSE(boolean fair) {
1509 // final PublicReentrantReadWriteLock lock =
1510 // new PublicReentrantReadWriteLock(fair);
1511 // final Condition c = lock.writeLock().newCondition();
1512 // try {
1513 // lock.getWaitingThreads(c);
1514 // shouldThrow();
1515 // } catch (IllegalMonitorStateException success) {}
1516 // }
1517
1518 // /**
1519 // * hasWaiters returns true when a thread is waiting, else false
1520 // */
1521 // public void testHasWaiters() { testHasWaiters(false); }
1522 // public void testHasWaiters_fair() { testHasWaiters(true); }
1523 // public void testHasWaiters(boolean fair) {
1524 // final PublicReentrantReadWriteLock lock =
1525 // new PublicReentrantReadWriteLock(fair);
1526 // final Condition c = lock.writeLock().newCondition();
1527 // final CountDownLatch locked = new CountDownLatch(1);
1528 // Thread t = newStartedThread(new CheckedRunnable() {
1529 // public void realRun() throws InterruptedException {
1530 // lock.writeLock().lock();
1531 // assertHasNoWaiters(lock, c);
1532 // assertFalse(lock.hasWaiters(c));
1533 // locked.countDown();
1534 // c.await();
1535 // assertHasNoWaiters(lock, c);
1536 // assertFalse(lock.hasWaiters(c));
1537 // lock.writeLock().unlock();
1538 // }});
1539
1540 // await(locked);
1541 // lock.writeLock().lock();
1542 // assertHasWaiters(lock, c, t);
1543 // assertTrue(lock.hasWaiters(c));
1544 // c.signal();
1545 // assertHasNoWaiters(lock, c);
1546 // assertFalse(lock.hasWaiters(c));
1547 // lock.writeLock().unlock();
1548 // awaitTermination(t);
1549 // assertHasNoWaiters(lock, c);
1550 // }
1551
1552 // /**
1553 // * getWaitQueueLength returns number of waiting threads
1554 // */
1555 // public void testGetWaitQueueLength() { testGetWaitQueueLength(false); }
1556 // public void testGetWaitQueueLength_fair() { testGetWaitQueueLength(true); }
1557 // public void testGetWaitQueueLength(boolean fair) {
1558 // final PublicReentrantReadWriteLock lock =
1559 // new PublicReentrantReadWriteLock(fair);
1560 // final Condition c = lock.writeLock().newCondition();
1561 // final CountDownLatch locked = new CountDownLatch(1);
1562 // Thread t = newStartedThread(new CheckedRunnable() {
1563 // public void realRun() throws InterruptedException {
1564 // lock.writeLock().lock();
1565 // assertEquals(0, lock.getWaitQueueLength(c));
1566 // locked.countDown();
1567 // c.await();
1568 // lock.writeLock().unlock();
1569 // }});
1570
1571 // await(locked);
1572 // lock.writeLock().lock();
1573 // assertHasWaiters(lock, c, t);
1574 // assertEquals(1, lock.getWaitQueueLength(c));
1575 // c.signal();
1576 // assertHasNoWaiters(lock, c);
1577 // assertEquals(0, lock.getWaitQueueLength(c));
1578 // lock.writeLock().unlock();
1579 // awaitTermination(t);
1580 // }
1581
1582 // /**
1583 // * getWaitingThreads returns only and all waiting threads
1584 // */
1585 // public void testGetWaitingThreads() { testGetWaitingThreads(false); }
1586 // public void testGetWaitingThreads_fair() { testGetWaitingThreads(true); }
1587 // public void testGetWaitingThreads(boolean fair) {
1588 // final PublicReentrantReadWriteLock lock =
1589 // new PublicReentrantReadWriteLock(fair);
1590 // final Condition c = lock.writeLock().newCondition();
1591 // final CountDownLatch locked1 = new CountDownLatch(1);
1592 // final CountDownLatch locked2 = new CountDownLatch(1);
1593 // Thread t1 = new Thread(new CheckedRunnable() {
1594 // public void realRun() throws InterruptedException {
1595 // lock.writeLock().lock();
1596 // assertTrue(lock.getWaitingThreads(c).isEmpty());
1597 // locked1.countDown();
1598 // c.await();
1599 // lock.writeLock().unlock();
1600 // }});
1601
1602 // Thread t2 = new Thread(new CheckedRunnable() {
1603 // public void realRun() throws InterruptedException {
1604 // lock.writeLock().lock();
1605 // assertFalse(lock.getWaitingThreads(c).isEmpty());
1606 // locked2.countDown();
1607 // c.await();
1608 // lock.writeLock().unlock();
1609 // }});
1610
1611 // lock.writeLock().lock();
1612 // assertTrue(lock.getWaitingThreads(c).isEmpty());
1613 // lock.writeLock().unlock();
1614
1615 // t1.start();
1616 // await(locked1);
1617 // t2.start();
1618 // await(locked2);
1619
1620 // lock.writeLock().lock();
1621 // assertTrue(lock.hasWaiters(c));
1622 // assertTrue(lock.getWaitingThreads(c).contains(t1));
1623 // assertTrue(lock.getWaitingThreads(c).contains(t2));
1624 // assertEquals(2, lock.getWaitingThreads(c).size());
1625 // c.signalAll();
1626 // assertHasNoWaiters(lock, c);
1627 // lock.writeLock().unlock();
1628
1629 // awaitTermination(t1);
1630 // awaitTermination(t2);
1631
1632 // assertHasNoWaiters(lock, c);
1633 // }
1634
1635 // /**
1636 // * toString indicates current lock state
1637 // */
1638 // public void testToString() { testToString(false); }
1639 // public void testToString_fair() { testToString(true); }
1640 // public void testToString(boolean fair) {
1641 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1642 // assertTrue(lock.toString().contains("Write locks = 0"));
1643 // assertTrue(lock.toString().contains("Read locks = 0"));
1644 // lock.writeLock().lock();
1645 // assertTrue(lock.toString().contains("Write locks = 1"));
1646 // assertTrue(lock.toString().contains("Read locks = 0"));
1647 // lock.writeLock().unlock();
1648 // lock.readLock().lock();
1649 // lock.readLock().lock();
1650 // assertTrue(lock.toString().contains("Write locks = 0"));
1651 // assertTrue(lock.toString().contains("Read locks = 2"));
1652 // }
1653
1654 // /**
1655 // * readLock.toString indicates current lock state
1656 // */
1657 // public void testReadLockToString() { testReadLockToString(false); }
1658 // public void testReadLockToString_fair() { testReadLockToString(true); }
1659 // public void testReadLockToString(boolean fair) {
1660 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1661 // assertTrue(lock.readLock().toString().contains("Read locks = 0"));
1662 // lock.readLock().lock();
1663 // lock.readLock().lock();
1664 // assertTrue(lock.readLock().toString().contains("Read locks = 2"));
1665 // }
1666
1667 // /**
1668 // * writeLock.toString indicates current lock state
1669 // */
1670 // public void testWriteLockToString() { testWriteLockToString(false); }
1671 // public void testWriteLockToString_fair() { testWriteLockToString(true); }
1672 // public void testWriteLockToString(boolean fair) {
1673 // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1674 // assertTrue(lock.writeLock().toString().contains("Unlocked"));
1675 // lock.writeLock().lock();
1676 // assertTrue(lock.writeLock().toString().contains("Locked"));
1677 // lock.writeLock().unlock();
1678 // assertTrue(lock.writeLock().toString().contains("Unlocked"));
1679 // }
1680
1681 }