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

Comparing jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java (file contents):
Revision 1.7 by dl, Fri Jan 2 21:06:38 2004 UTC vs.
Revision 1.37 by jsr166, Mon Oct 11 06:36:20 2010 UTC

# Line 2 | Line 2
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4   * http://creativecommons.org/licenses/publicdomain
5 < * Other contributors include Andrew Wright, Jeffrey Hayes,
6 < * Pat Fisher, Mike Judd.
5 > * Other contributors include Andrew Wright, Jeffrey Hayes,
6 > * Pat Fisher, Mike Judd.
7   */
8  
9  
10   import junit.framework.*;
11   import java.util.*;
12   import java.util.concurrent.*;
13 + import static java.util.concurrent.TimeUnit.MILLISECONDS;
14   import java.util.concurrent.locks.*;
15   import java.io.*;
16  
17   public class AbstractQueuedSynchronizerTest extends JSR166TestCase {
18      public static void main(String[] args) {
19 <        junit.textui.TestRunner.run (suite());
19 >        junit.textui.TestRunner.run(suite());
20      }
21      public static Test suite() {
22          return new TestSuite(AbstractQueuedSynchronizerTest.class);
23      }
24  
25      /**
26 <     * A simple mutex class, from the AbstractQueuedSynchronizer
27 <     * javadoc.  All tests exercise this as a sample user extension.
28 <     * Other methods/features of AbstractQueuedSynchronizerTest are
29 <     * tested implicitly in ReentrantLock, ReentrantReadWriteLock, and
30 <     * Semaphore test classes
31 <     */
32 <    static class Mutex implements Lock, java.io.Serializable {
33 <        private static class Sync extends AbstractQueuedSynchronizer {
34 <            boolean isLocked() { return getState() == 1; }
35 <
36 <            public boolean tryAcquireExclusive(boolean isQueued, int acquires) {
37 <                assert acquires == 1; // Does not use multiple acquires
38 <                return compareAndSetState(0, 1);
38 <            }
39 <            
40 <            public boolean tryReleaseExclusive(int releases) {
41 <                setState(0);
42 <                return true;
43 <            }
44 <            
45 <            public void checkConditionAccess(Thread thread, boolean waiting) {
46 <                if (getState() == 0) throw new IllegalMonitorStateException();
47 <            }
48 <            
49 <            Condition newCondition() { return new ConditionObject(); }
50 <            
51 <            private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
52 <                s.defaultReadObject();
53 <                setState(0); // reset to unlocked state
54 <            }
26 >     * A simple mutex class, adapted from the
27 >     * AbstractQueuedSynchronizer javadoc.  Exclusive acquire tests
28 >     * exercise this as a sample user extension.  Other
29 >     * methods/features of AbstractQueuedSynchronizerTest are tested
30 >     * via other test classes, including those for ReentrantLock,
31 >     * ReentrantReadWriteLock, and Semaphore
32 >     */
33 >    static class Mutex extends AbstractQueuedSynchronizer {
34 >        public boolean isHeldExclusively() { return getState() == 1; }
35 >
36 >        public boolean tryAcquire(int acquires) {
37 >            assertEquals(1, acquires);
38 >            return compareAndSetState(0, 1);
39          }
40 <        
41 <        private final Sync sync = new Sync();
42 <        public boolean tryLock() {
43 <            return sync.tryAcquireExclusive(false, 1);
40 >
41 >        public boolean tryRelease(int releases) {
42 >            if (getState() == 0) throw new IllegalMonitorStateException();
43 >            setState(0);
44 >            return true;
45          }
46 <        public void lock() {
47 <            sync.acquireExclusiveUninterruptibly(1);
46 >
47 >        public AbstractQueuedSynchronizer.ConditionObject newCondition() {
48 >            return new AbstractQueuedSynchronizer.ConditionObject();
49          }
50 <        public void lockInterruptibly() throws InterruptedException {
51 <            sync.acquireExclusiveInterruptibly(1);
50 >
51 >    }
52 >
53 >
54 >    /**
55 >     * A simple latch class, to test shared mode.
56 >     */
57 >    static class BooleanLatch extends AbstractQueuedSynchronizer {
58 >        public boolean isSignalled() { return getState() != 0; }
59 >
60 >        public int tryAcquireShared(int ignore) {
61 >            return isSignalled()? 1 : -1;
62          }
63 <        public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
64 <            return sync.acquireExclusiveTimed(1, unit.toNanos(timeout));
63 >
64 >        public boolean tryReleaseShared(int ignore) {
65 >            setState(1);
66 >            return true;
67          }
70        public void unlock() { sync.releaseExclusive(1); }
71        public Condition newCondition() { return sync.newCondition(); }
72        public boolean isLocked() { return sync.isLocked(); }
73        public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); }
68      }
69  
70      /**
71 <     * A runnable calling lockInterruptibly
72 <     */
73 <    class InterruptibleLockRunnable implements Runnable {
74 <        final Mutex lock;
75 <        InterruptibleLockRunnable(Mutex l) { lock = l; }
76 <        public void run() {
77 <            try {
78 <                lock.lockInterruptibly();
85 <            } catch(InterruptedException success){}
71 >     * A runnable calling acquireInterruptibly that does not expect to
72 >     * be interrupted.
73 >     */
74 >    class InterruptibleSyncRunnable extends CheckedRunnable {
75 >        final Mutex sync;
76 >        InterruptibleSyncRunnable(Mutex l) { sync = l; }
77 >        public void realRun() throws InterruptedException {
78 >            sync.acquireInterruptibly(1);
79          }
80      }
81  
82  
83      /**
84 <     * A runnable calling lockInterruptibly that expects to be
85 <     * interrupted
84 >     * A runnable calling acquireInterruptibly that expects to be
85 >     * interrupted.
86       */
87 <    class InterruptedLockRunnable implements Runnable {
88 <        final Mutex lock;
89 <        InterruptedLockRunnable(Mutex l) { lock = l; }
90 <        public void run() {
91 <            try {
99 <                lock.lockInterruptibly();
100 <                threadShouldThrow();
101 <            } catch(InterruptedException success){}
87 >    class InterruptedSyncRunnable extends CheckedInterruptedRunnable {
88 >        final Mutex sync;
89 >        InterruptedSyncRunnable(Mutex l) { sync = l; }
90 >        public void realRun() throws InterruptedException {
91 >            sync.acquireInterruptibly(1);
92          }
93      }
94 <    
94 >
95 >    /**
96 >     * isHeldExclusively is false upon construction
97 >     */
98 >    public void testIsHeldExclusively() {
99 >        Mutex rl = new Mutex();
100 >        assertFalse(rl.isHeldExclusively());
101 >    }
102 >
103      /**
104 <     * locking an unlocked lock succeeds
104 >     * acquiring released sync succeeds
105       */
106 <    public void testLock() {
107 <        Mutex rl = new Mutex();
108 <        rl.lock();
109 <        assertTrue(rl.isLocked());
110 <        rl.unlock();
106 >    public void testAcquire() {
107 >        Mutex rl = new Mutex();
108 >        rl.acquire(1);
109 >        assertTrue(rl.isHeldExclusively());
110 >        rl.release(1);
111 >        assertFalse(rl.isHeldExclusively());
112      }
113  
114      /**
115 <     * tryLock on an unlocked lock succeeds
115 >     * tryAcquire on an released sync succeeds
116       */
117 <    public void testTryLock() {
118 <        Mutex rl = new Mutex();
119 <        assertTrue(rl.tryLock());
120 <        assertTrue(rl.isLocked());
121 <        rl.unlock();
117 >    public void testTryAcquire() {
118 >        Mutex rl = new Mutex();
119 >        assertTrue(rl.tryAcquire(1));
120 >        assertTrue(rl.isHeldExclusively());
121 >        rl.release(1);
122      }
123  
124      /**
125       * hasQueuedThreads reports whether there are waiting threads
126       */
127 <    public void testhasQueuedThreads() {
128 <        final Mutex lock = new Mutex();
129 <        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
130 <        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
131 <        try {
132 <            assertFalse(lock.hasQueuedThreads());
133 <            lock.lock();
134 <            t1.start();
135 <            Thread.sleep(SHORT_DELAY_MS);
136 <            assertTrue(lock.hasQueuedThreads());
137 <            t2.start();
138 <            Thread.sleep(SHORT_DELAY_MS);
139 <            assertTrue(lock.hasQueuedThreads());
140 <            t1.interrupt();
141 <            Thread.sleep(SHORT_DELAY_MS);
142 <            assertTrue(lock.hasQueuedThreads());
143 <            lock.unlock();
144 <            Thread.sleep(SHORT_DELAY_MS);
145 <            assertFalse(lock.hasQueuedThreads());
146 <            t1.join();
147 <            t2.join();
149 <        } catch(Exception e){
150 <            unexpectedException();
151 <        }
152 <    }
127 >    public void testhasQueuedThreads() throws InterruptedException {
128 >        final Mutex sync = new Mutex();
129 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
130 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
131 >        assertFalse(sync.hasQueuedThreads());
132 >        sync.acquire(1);
133 >        t1.start();
134 >        Thread.sleep(SHORT_DELAY_MS);
135 >        assertTrue(sync.hasQueuedThreads());
136 >        t2.start();
137 >        Thread.sleep(SHORT_DELAY_MS);
138 >        assertTrue(sync.hasQueuedThreads());
139 >        t1.interrupt();
140 >        Thread.sleep(SHORT_DELAY_MS);
141 >        assertTrue(sync.hasQueuedThreads());
142 >        sync.release(1);
143 >        Thread.sleep(SHORT_DELAY_MS);
144 >        assertFalse(sync.hasQueuedThreads());
145 >        t1.join();
146 >        t2.join();
147 >    }
148  
149      /**
150 <     * timed tryLock is interruptible.
150 >     * isQueued(null) throws NPE
151       */
152 <    public void testInterruptedException2() {
153 <        final Mutex lock = new Mutex();
154 <        lock.lock();
155 <        Thread t = new Thread(new Runnable() {
156 <                public void run() {
157 <                    try {
163 <                        lock.tryLock(MEDIUM_DELAY_MS,TimeUnit.MILLISECONDS);
164 <                        threadShouldThrow();
165 <                    } catch(InterruptedException success){}
166 <                }
167 <            });
168 <        try {
169 <            t.start();
170 <            t.interrupt();
171 <        } catch(Exception e){
172 <            unexpectedException();
173 <        }
152 >    public void testIsQueuedNPE() {
153 >        final Mutex sync = new Mutex();
154 >        try {
155 >            sync.isQueued(null);
156 >            shouldThrow();
157 >        } catch (NullPointerException success) {}
158      }
159  
160 +    /**
161 +     * isQueued reports whether a thread is queued.
162 +     */
163 +    public void testIsQueued() throws InterruptedException {
164 +        final Mutex sync = new Mutex();
165 +        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
166 +        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
167 +        assertFalse(sync.isQueued(t1));
168 +        assertFalse(sync.isQueued(t2));
169 +        sync.acquire(1);
170 +        t1.start();
171 +        Thread.sleep(SHORT_DELAY_MS);
172 +        assertTrue(sync.isQueued(t1));
173 +        t2.start();
174 +        Thread.sleep(SHORT_DELAY_MS);
175 +        assertTrue(sync.isQueued(t1));
176 +        assertTrue(sync.isQueued(t2));
177 +        t1.interrupt();
178 +        Thread.sleep(SHORT_DELAY_MS);
179 +        assertFalse(sync.isQueued(t1));
180 +        assertTrue(sync.isQueued(t2));
181 +        sync.release(1);
182 +        Thread.sleep(SHORT_DELAY_MS);
183 +        assertFalse(sync.isQueued(t1));
184 +        Thread.sleep(SHORT_DELAY_MS);
185 +        assertFalse(sync.isQueued(t2));
186 +        t1.join();
187 +        t2.join();
188 +    }
189  
190      /**
191 <     * TryLock on a locked lock fails
191 >     * getFirstQueuedThread returns first waiting thread or null if none
192       */
193 <    public void testTryLockWhenLocked() {
194 <        final Mutex lock = new Mutex();
195 <        lock.lock();
196 <        Thread t = new Thread(new Runnable() {
197 <                public void run() {
198 <                    threadAssertFalse(lock.tryLock());
199 <                }
200 <            });
201 <        try {
202 <            t.start();
203 <            t.join();
204 <            lock.unlock();
205 <        } catch(Exception e){
206 <            unexpectedException();
207 <        }
208 <    }
193 >    public void testGetFirstQueuedThread() throws InterruptedException {
194 >        final Mutex sync = new Mutex();
195 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
196 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
197 >        assertNull(sync.getFirstQueuedThread());
198 >        sync.acquire(1);
199 >        t1.start();
200 >        Thread.sleep(SHORT_DELAY_MS);
201 >        assertEquals(t1, sync.getFirstQueuedThread());
202 >        t2.start();
203 >        Thread.sleep(SHORT_DELAY_MS);
204 >        assertEquals(t1, sync.getFirstQueuedThread());
205 >        t1.interrupt();
206 >        Thread.sleep(SHORT_DELAY_MS);
207 >        Thread.sleep(SHORT_DELAY_MS);
208 >        assertEquals(t2, sync.getFirstQueuedThread());
209 >        sync.release(1);
210 >        Thread.sleep(SHORT_DELAY_MS);
211 >        assertNull(sync.getFirstQueuedThread());
212 >        t1.join();
213 >        t2.join();
214 >    }
215 >
216  
217      /**
218 <     * Timed tryLock on a locked lock times out
218 >     * hasContended reports false if no thread has ever blocked, else true
219       */
220 <    public void testTryLock_Timeout() {
221 <        final Mutex lock = new Mutex();
222 <        lock.lock();
223 <        Thread t = new Thread(new Runnable() {
224 <                public void run() {
225 <                    try {
226 <                        threadAssertFalse(lock.tryLock(1, TimeUnit.MILLISECONDS));
227 <                    } catch (Exception ex) {
228 <                        threadUnexpectedException();
229 <                    }
230 <                }
231 <            });
232 <        try {
233 <            t.start();
234 <            t.join();
235 <            lock.unlock();
236 <        } catch(Exception e){
237 <            unexpectedException();
238 <        }
239 <    }
220 <    
221 <  
222 <    /**
223 <     * isLocked is true when locked and false when not
224 <     */
225 <    public void testIsLocked() {
226 <        final Mutex lock = new Mutex();
227 <        lock.lock();
228 <        assertTrue(lock.isLocked());
229 <        lock.unlock();
230 <        assertFalse(lock.isLocked());
231 <        Thread t = new Thread(new Runnable() {
232 <                public void run() {
233 <                    lock.lock();
234 <                    try {
235 <                        Thread.sleep(SMALL_DELAY_MS);
236 <                    }
237 <                    catch(Exception e) {
238 <                        threadUnexpectedException();
239 <                    }
240 <                    lock.unlock();
241 <                }
242 <            });
243 <        try {
244 <            t.start();
245 <            Thread.sleep(SHORT_DELAY_MS);
246 <            assertTrue(lock.isLocked());
247 <            t.join();
248 <            assertFalse(lock.isLocked());
249 <        } catch(Exception e){
250 <            unexpectedException();
251 <        }
220 >    public void testHasContended() throws InterruptedException {
221 >        final Mutex sync = new Mutex();
222 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
223 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
224 >        assertFalse(sync.hasContended());
225 >        sync.acquire(1);
226 >        t1.start();
227 >        Thread.sleep(SHORT_DELAY_MS);
228 >        assertTrue(sync.hasContended());
229 >        t2.start();
230 >        Thread.sleep(SHORT_DELAY_MS);
231 >        assertTrue(sync.hasContended());
232 >        t1.interrupt();
233 >        Thread.sleep(SHORT_DELAY_MS);
234 >        assertTrue(sync.hasContended());
235 >        sync.release(1);
236 >        Thread.sleep(SHORT_DELAY_MS);
237 >        assertTrue(sync.hasContended());
238 >        t1.join();
239 >        t2.join();
240      }
241  
242 +    /**
243 +     * getQueuedThreads includes waiting threads
244 +     */
245 +    public void testGetQueuedThreads() throws InterruptedException {
246 +        final Mutex sync = new Mutex();
247 +        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
248 +        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
249 +        assertTrue(sync.getQueuedThreads().isEmpty());
250 +        sync.acquire(1);
251 +        assertTrue(sync.getQueuedThreads().isEmpty());
252 +        t1.start();
253 +        Thread.sleep(SHORT_DELAY_MS);
254 +        assertTrue(sync.getQueuedThreads().contains(t1));
255 +        t2.start();
256 +        Thread.sleep(SHORT_DELAY_MS);
257 +        assertTrue(sync.getQueuedThreads().contains(t1));
258 +        assertTrue(sync.getQueuedThreads().contains(t2));
259 +        t1.interrupt();
260 +        Thread.sleep(SHORT_DELAY_MS);
261 +        assertFalse(sync.getQueuedThreads().contains(t1));
262 +        assertTrue(sync.getQueuedThreads().contains(t2));
263 +        sync.release(1);
264 +        Thread.sleep(SHORT_DELAY_MS);
265 +        assertTrue(sync.getQueuedThreads().isEmpty());
266 +        t1.join();
267 +        t2.join();
268 +    }
269  
270      /**
271 <     * lockInterruptibly is interruptible.
271 >     * getExclusiveQueuedThreads includes waiting threads
272       */
273 <    public void testLockInterruptibly1() {
274 <        final Mutex lock = new Mutex();
275 <        lock.lock();
276 <        Thread t = new Thread(new InterruptedLockRunnable(lock));
277 <        try {
278 <            t.start();
279 <            t.interrupt();
280 <            lock.unlock();
281 <            t.join();
282 <        } catch(Exception e){
283 <            unexpectedException();
284 <        }
285 <    }
273 >    public void testGetExclusiveQueuedThreads() throws InterruptedException {
274 >        final Mutex sync = new Mutex();
275 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
276 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
277 >        assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
278 >        sync.acquire(1);
279 >        assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
280 >        t1.start();
281 >        Thread.sleep(SHORT_DELAY_MS);
282 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
283 >        t2.start();
284 >        Thread.sleep(SHORT_DELAY_MS);
285 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
286 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
287 >        t1.interrupt();
288 >        Thread.sleep(SHORT_DELAY_MS);
289 >        assertFalse(sync.getExclusiveQueuedThreads().contains(t1));
290 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
291 >        sync.release(1);
292 >        Thread.sleep(SHORT_DELAY_MS);
293 >        assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
294 >        t1.join();
295 >        t2.join();
296 >    }
297  
298      /**
299 <     * lockInterruptibly succeeds when unlocked, else is interruptible
299 >     * getSharedQueuedThreads does not include exclusively waiting threads
300       */
301 <    public void testLockInterruptibly2() {
302 <        final Mutex lock = new Mutex();
303 <        try {
304 <            lock.lockInterruptibly();
305 <        } catch(Exception e) {
306 <            unexpectedException();
307 <        }
308 <        Thread t = new Thread(new InterruptedLockRunnable(lock));
309 <        try {
310 <            t.start();
311 <            t.interrupt();
312 <            assertTrue(lock.isLocked());
313 <            t.join();
314 <        } catch(Exception e){
315 <            unexpectedException();
316 <        }
301 >    public void testGetSharedQueuedThreads() throws InterruptedException {
302 >        final Mutex sync = new Mutex();
303 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
304 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
305 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
306 >        sync.acquire(1);
307 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
308 >        t1.start();
309 >        Thread.sleep(SHORT_DELAY_MS);
310 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
311 >        t2.start();
312 >        Thread.sleep(SHORT_DELAY_MS);
313 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
314 >        t1.interrupt();
315 >        Thread.sleep(SHORT_DELAY_MS);
316 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
317 >        sync.release(1);
318 >        Thread.sleep(SHORT_DELAY_MS);
319 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
320 >        t1.join();
321 >        t2.join();
322 >    }
323 >
324 >    /**
325 >     * tryAcquireNanos is interruptible.
326 >     */
327 >    public void testInterruptedException2() throws InterruptedException {
328 >        final Mutex sync = new Mutex();
329 >        sync.acquire(1);
330 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
331 >            public void realRun() throws InterruptedException {
332 >                sync.tryAcquireNanos(1, MILLISECONDS.toNanos(MEDIUM_DELAY_MS));
333 >            }});
334 >
335 >        t.start();
336 >        Thread.sleep(SHORT_DELAY_MS);
337 >        t.interrupt();
338 >        t.join();
339 >    }
340 >
341 >
342 >    /**
343 >     * TryAcquire on exclusively held sync fails
344 >     */
345 >    public void testTryAcquireWhenSynced() throws InterruptedException {
346 >        final Mutex sync = new Mutex();
347 >        sync.acquire(1);
348 >        Thread t = new Thread(new CheckedRunnable() {
349 >            public void realRun() {
350 >                assertFalse(sync.tryAcquire(1));
351 >            }});
352 >
353 >        t.start();
354 >        t.join();
355 >        sync.release(1);
356 >    }
357 >
358 >    /**
359 >     * tryAcquireNanos on an exclusively held sync times out
360 >     */
361 >    public void testAcquireNanos_Timeout() throws InterruptedException {
362 >        final Mutex sync = new Mutex();
363 >        sync.acquire(1);
364 >        Thread t = new Thread(new CheckedRunnable() {
365 >            public void realRun() throws InterruptedException {
366 >                long nanos = MILLISECONDS.toNanos(SHORT_DELAY_MS);
367 >                assertFalse(sync.tryAcquireNanos(1, nanos));
368 >            }});
369 >
370 >        t.start();
371 >        t.join();
372 >        sync.release(1);
373 >    }
374 >
375 >
376 >    /**
377 >     * getState is true when acquired and false when not
378 >     */
379 >    public void testGetState() throws InterruptedException {
380 >        final Mutex sync = new Mutex();
381 >        sync.acquire(1);
382 >        assertTrue(sync.isHeldExclusively());
383 >        sync.release(1);
384 >        assertFalse(sync.isHeldExclusively());
385 >        Thread t = new Thread(new CheckedRunnable() {
386 >            public void realRun() throws InterruptedException {
387 >                sync.acquire(1);
388 >                Thread.sleep(SMALL_DELAY_MS);
389 >                sync.release(1);
390 >            }});
391 >
392 >        t.start();
393 >        Thread.sleep(SHORT_DELAY_MS);
394 >        assertTrue(sync.isHeldExclusively());
395 >        t.join();
396 >        assertFalse(sync.isHeldExclusively());
397 >    }
398 >
399 >
400 >    /**
401 >     * acquireInterruptibly is interruptible.
402 >     */
403 >    public void testAcquireInterruptibly1() throws InterruptedException {
404 >        final Mutex sync = new Mutex();
405 >        sync.acquire(1);
406 >        Thread t = new Thread(new InterruptedSyncRunnable(sync));
407 >
408 >        t.start();
409 >        Thread.sleep(SHORT_DELAY_MS);
410 >        t.interrupt();
411 >        Thread.sleep(SHORT_DELAY_MS);
412 >        sync.release(1);
413 >        t.join();
414 >    }
415 >
416 >    /**
417 >     * acquireInterruptibly succeeds when released, else is interruptible
418 >     */
419 >    public void testAcquireInterruptibly2() throws InterruptedException {
420 >        final Mutex sync = new Mutex();
421 >        sync.acquireInterruptibly(1);
422 >        Thread t = new Thread(new InterruptedSyncRunnable(sync));
423 >        t.start();
424 >        Thread.sleep(SHORT_DELAY_MS);
425 >        t.interrupt();
426 >        assertTrue(sync.isHeldExclusively());
427 >        t.join();
428 >    }
429 >
430 >    /**
431 >     * owns is true for a condition created by sync else false
432 >     */
433 >    public void testOwns() {
434 >        final Mutex sync = new Mutex();
435 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
436 >        final Mutex sync2 = new Mutex();
437 >        assertTrue(sync.owns(c));
438 >        assertFalse(sync2.owns(c));
439      }
440  
441      /**
442 <     * Calling await without holding lock throws IllegalMonitorStateException
442 >     * Calling await without holding sync throws IllegalMonitorStateException
443       */
444 <    public void testAwait_IllegalMonitor() {
445 <        final Mutex lock = new Mutex();
446 <        final Condition c = lock.newCondition();
444 >    public void testAwait_IllegalMonitor() throws InterruptedException {
445 >        final Mutex sync = new Mutex();
446 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
447          try {
448              c.await();
449              shouldThrow();
450 <        }
303 <        catch (IllegalMonitorStateException success) {
304 <        }
305 <        catch (Exception ex) {
306 <            unexpectedException();
307 <        }
450 >        } catch (IllegalMonitorStateException success) {}
451      }
452  
453      /**
454 <     * Calling signal without holding lock throws IllegalMonitorStateException
454 >     * Calling signal without holding sync throws IllegalMonitorStateException
455       */
456      public void testSignal_IllegalMonitor() {
457 <        final Mutex lock = new Mutex();
458 <        final Condition c = lock.newCondition();
457 >        final Mutex sync = new Mutex();
458 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
459          try {
460              c.signal();
461              shouldThrow();
462 <        }
320 <        catch (IllegalMonitorStateException success) {
321 <        }
322 <        catch (Exception ex) {
323 <            unexpectedException();
324 <        }
462 >        } catch (IllegalMonitorStateException success) {}
463      }
464  
465      /**
466       * awaitNanos without a signal times out
467       */
468 <    public void testAwaitNanos_Timeout() {
469 <        final Mutex lock = new Mutex();
470 <        final Condition c = lock.newCondition();
471 <        try {
472 <            lock.lock();
473 <            long t = c.awaitNanos(100);
474 <            assertTrue(t <= 0);
337 <            lock.unlock();
338 <        }
339 <        catch (Exception ex) {
340 <            unexpectedException();
341 <        }
468 >    public void testAwaitNanos_Timeout() throws InterruptedException {
469 >        final Mutex sync = new Mutex();
470 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
471 >        sync.acquire(1);
472 >        long t = c.awaitNanos(100);
473 >        assertTrue(t <= 0);
474 >        sync.release(1);
475      }
476  
477      /**
478 <     *  timed await without a signal times out
478 >     * Timed await without a signal times out
479       */
480 <    public void testAwait_Timeout() {
481 <        final Mutex lock = new Mutex();
482 <        final Condition c = lock.newCondition();
483 <        try {
484 <            lock.lock();
485 <            assertFalse(c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
353 <            lock.unlock();
354 <        }
355 <        catch (Exception ex) {
356 <            unexpectedException();
357 <        }
480 >    public void testAwait_Timeout() throws InterruptedException {
481 >        final Mutex sync = new Mutex();
482 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
483 >        sync.acquire(1);
484 >        assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
485 >        sync.release(1);
486      }
487  
488      /**
489       * awaitUntil without a signal times out
490       */
491 <    public void testAwaitUntil_Timeout() {
492 <        final Mutex lock = new Mutex();
493 <        final Condition c = lock.newCondition();
494 <        try {
495 <            lock.lock();
496 <            java.util.Date d = new java.util.Date();
497 <            assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
370 <            lock.unlock();
371 <        }
372 <        catch (Exception ex) {
373 <            unexpectedException();
374 <        }
491 >    public void testAwaitUntil_Timeout() throws InterruptedException {
492 >        final Mutex sync = new Mutex();
493 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
494 >        sync.acquire(1);
495 >        java.util.Date d = new java.util.Date();
496 >        assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
497 >        sync.release(1);
498      }
499  
500      /**
501       * await returns when signalled
502       */
503 <    public void testAwait() {
504 <        final Mutex lock = new Mutex();
505 <        final Condition c = lock.newCondition();
506 <        Thread t = new Thread(new Runnable() {
507 <                public void run() {
508 <                    try {
509 <                        lock.lock();
510 <                        c.await();
511 <                        lock.unlock();
512 <                    }
513 <                    catch(InterruptedException e) {
514 <                        threadUnexpectedException();
515 <                    }
516 <                }
517 <            });
518 <
519 <        try {
520 <            t.start();
521 <            Thread.sleep(SHORT_DELAY_MS);
522 <            lock.lock();
523 <            c.signal();
524 <            lock.unlock();
525 <            t.join(SHORT_DELAY_MS);
526 <            assertFalse(t.isAlive());
527 <        }
528 <        catch (Exception ex) {
529 <            unexpectedException();
530 <        }
503 >    public void testAwait() throws InterruptedException {
504 >        final Mutex sync = new Mutex();
505 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
506 >        Thread t = new Thread(new CheckedRunnable() {
507 >            public void realRun() throws InterruptedException {
508 >                sync.acquire(1);
509 >                c.await();
510 >                sync.release(1);
511 >            }});
512 >
513 >        t.start();
514 >        Thread.sleep(SHORT_DELAY_MS);
515 >        sync.acquire(1);
516 >        c.signal();
517 >        sync.release(1);
518 >        t.join(SHORT_DELAY_MS);
519 >        assertFalse(t.isAlive());
520 >    }
521 >
522 >
523 >
524 >    /**
525 >     * hasWaiters throws NPE if null
526 >     */
527 >    public void testHasWaitersNPE() {
528 >        final Mutex sync = new Mutex();
529 >        try {
530 >            sync.hasWaiters(null);
531 >            shouldThrow();
532 >        } catch (NullPointerException success) {}
533 >    }
534 >
535 >    /**
536 >     * getWaitQueueLength throws NPE if null
537 >     */
538 >    public void testGetWaitQueueLengthNPE() {
539 >        final Mutex sync = new Mutex();
540 >        try {
541 >            sync.getWaitQueueLength(null);
542 >            shouldThrow();
543 >        } catch (NullPointerException success) {}
544 >    }
545 >
546 >
547 >    /**
548 >     * getWaitingThreads throws NPE if null
549 >     */
550 >    public void testGetWaitingThreadsNPE() {
551 >        final Mutex sync = new Mutex();
552 >        try {
553 >            sync.getWaitingThreads(null);
554 >            shouldThrow();
555 >        } catch (NullPointerException success) {}
556      }
557 <    
557 >
558 >
559 >    /**
560 >     * hasWaiters throws IAE if not owned
561 >     */
562 >    public void testHasWaitersIAE() {
563 >        final Mutex sync = new Mutex();
564 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
565 >        final Mutex sync2 = new Mutex();
566 >        try {
567 >            sync2.hasWaiters(c);
568 >            shouldThrow();
569 >        } catch (IllegalArgumentException success) {}
570 >    }
571 >
572 >    /**
573 >     * hasWaiters throws IMSE if not synced
574 >     */
575 >    public void testHasWaitersIMSE() {
576 >        final Mutex sync = new Mutex();
577 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
578 >        try {
579 >            sync.hasWaiters(c);
580 >            shouldThrow();
581 >        } catch (IllegalMonitorStateException success) {}
582 >    }
583 >
584 >
585 >    /**
586 >     * getWaitQueueLength throws IAE if not owned
587 >     */
588 >    public void testGetWaitQueueLengthIAE() {
589 >        final Mutex sync = new Mutex();
590 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
591 >        final Mutex sync2 = new Mutex();
592 >        try {
593 >            sync2.getWaitQueueLength(c);
594 >            shouldThrow();
595 >        } catch (IllegalArgumentException success) {}
596 >    }
597 >
598 >    /**
599 >     * getWaitQueueLength throws IMSE if not synced
600 >     */
601 >    public void testGetWaitQueueLengthIMSE() {
602 >        final Mutex sync = new Mutex();
603 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
604 >        try {
605 >            sync.getWaitQueueLength(c);
606 >            shouldThrow();
607 >        } catch (IllegalMonitorStateException success) {}
608 >    }
609 >
610 >
611 >    /**
612 >     * getWaitingThreads throws IAE if not owned
613 >     */
614 >    public void testGetWaitingThreadsIAE() {
615 >        final Mutex sync = new Mutex();
616 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
617 >        final Mutex sync2 = new Mutex();
618 >        try {
619 >            sync2.getWaitingThreads(c);
620 >            shouldThrow();
621 >        } catch (IllegalArgumentException success) {}
622 >    }
623 >
624 >    /**
625 >     * getWaitingThreads throws IMSE if not synced
626 >     */
627 >    public void testGetWaitingThreadsIMSE() {
628 >        final Mutex sync = new Mutex();
629 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
630 >        try {
631 >            sync.getWaitingThreads(c);
632 >            shouldThrow();
633 >        } catch (IllegalMonitorStateException success) {}
634 >    }
635 >
636 >
637 >
638 >    /**
639 >     * hasWaiters returns true when a thread is waiting, else false
640 >     */
641 >    public void testHasWaiters() throws InterruptedException {
642 >        final Mutex sync = new Mutex();
643 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
644 >        Thread t = new Thread(new CheckedRunnable() {
645 >            public void realRun() throws InterruptedException {
646 >                sync.acquire(1);
647 >                assertFalse(sync.hasWaiters(c));
648 >                assertEquals(0, sync.getWaitQueueLength(c));
649 >                c.await();
650 >                sync.release(1);
651 >            }});
652 >
653 >        t.start();
654 >        Thread.sleep(SHORT_DELAY_MS);
655 >        sync.acquire(1);
656 >        assertTrue(sync.hasWaiters(c));
657 >        assertEquals(1, sync.getWaitQueueLength(c));
658 >        c.signal();
659 >        sync.release(1);
660 >        Thread.sleep(SHORT_DELAY_MS);
661 >        sync.acquire(1);
662 >        assertFalse(sync.hasWaiters(c));
663 >        assertEquals(0, sync.getWaitQueueLength(c));
664 >        sync.release(1);
665 >        t.join(SHORT_DELAY_MS);
666 >        assertFalse(t.isAlive());
667 >    }
668 >
669 >    /**
670 >     * getWaitQueueLength returns number of waiting threads
671 >     */
672 >    public void testGetWaitQueueLength() throws InterruptedException {
673 >        final Mutex sync = new Mutex();
674 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
675 >        Thread t1 = new Thread(new CheckedRunnable() {
676 >            public void realRun() throws InterruptedException {
677 >                sync.acquire(1);
678 >                assertFalse(sync.hasWaiters(c));
679 >                assertEquals(0, sync.getWaitQueueLength(c));
680 >                c.await();
681 >                sync.release(1);
682 >            }});
683 >
684 >        Thread t2 = new Thread(new CheckedRunnable() {
685 >            public void realRun() throws InterruptedException {
686 >                sync.acquire(1);
687 >                assertTrue(sync.hasWaiters(c));
688 >                assertEquals(1, sync.getWaitQueueLength(c));
689 >                c.await();
690 >                sync.release(1);
691 >            }});
692 >
693 >        t1.start();
694 >        Thread.sleep(SHORT_DELAY_MS);
695 >        t2.start();
696 >        Thread.sleep(SHORT_DELAY_MS);
697 >        sync.acquire(1);
698 >        assertTrue(sync.hasWaiters(c));
699 >        assertEquals(2, sync.getWaitQueueLength(c));
700 >        c.signalAll();
701 >        sync.release(1);
702 >        Thread.sleep(SHORT_DELAY_MS);
703 >        sync.acquire(1);
704 >        assertFalse(sync.hasWaiters(c));
705 >        assertEquals(0, sync.getWaitQueueLength(c));
706 >        sync.release(1);
707 >        t1.join(SHORT_DELAY_MS);
708 >        t2.join(SHORT_DELAY_MS);
709 >        assertFalse(t1.isAlive());
710 >        assertFalse(t2.isAlive());
711 >    }
712 >
713 >    /**
714 >     * getWaitingThreads returns only and all waiting threads
715 >     */
716 >    public void testGetWaitingThreads() throws InterruptedException {
717 >        final Mutex sync = new Mutex();
718 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
719 >        Thread t1 = new Thread(new CheckedRunnable() {
720 >            public void realRun() throws InterruptedException {
721 >                sync.acquire(1);
722 >                assertTrue(sync.getWaitingThreads(c).isEmpty());
723 >                c.await();
724 >                sync.release(1);
725 >            }});
726 >
727 >        Thread t2 = new Thread(new CheckedRunnable() {
728 >            public void realRun() throws InterruptedException {
729 >                sync.acquire(1);
730 >                assertFalse(sync.getWaitingThreads(c).isEmpty());
731 >                c.await();
732 >                sync.release(1);
733 >            }});
734 >
735 >        sync.acquire(1);
736 >        assertTrue(sync.getWaitingThreads(c).isEmpty());
737 >        sync.release(1);
738 >        t1.start();
739 >        Thread.sleep(SHORT_DELAY_MS);
740 >        t2.start();
741 >        Thread.sleep(SHORT_DELAY_MS);
742 >        sync.acquire(1);
743 >        assertTrue(sync.hasWaiters(c));
744 >        assertTrue(sync.getWaitingThreads(c).contains(t1));
745 >        assertTrue(sync.getWaitingThreads(c).contains(t2));
746 >        c.signalAll();
747 >        sync.release(1);
748 >        Thread.sleep(SHORT_DELAY_MS);
749 >        sync.acquire(1);
750 >        assertFalse(sync.hasWaiters(c));
751 >        assertTrue(sync.getWaitingThreads(c).isEmpty());
752 >        sync.release(1);
753 >        t1.join(SHORT_DELAY_MS);
754 >        t2.join(SHORT_DELAY_MS);
755 >        assertFalse(t1.isAlive());
756 >        assertFalse(t2.isAlive());
757 >    }
758 >
759 >
760 >
761 >    /**
762 >     * awaitUninterruptibly doesn't abort on interrupt
763 >     */
764 >    public void testAwaitUninterruptibly() throws InterruptedException {
765 >        final Mutex sync = new Mutex();
766 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
767 >        Thread t = new Thread(new CheckedRunnable() {
768 >            public void realRun() {
769 >                sync.acquire(1);
770 >                c.awaitUninterruptibly();
771 >                sync.release(1);
772 >            }});
773 >
774 >        t.start();
775 >        Thread.sleep(SHORT_DELAY_MS);
776 >        t.interrupt();
777 >        sync.acquire(1);
778 >        c.signal();
779 >        sync.release(1);
780 >        t.join(SHORT_DELAY_MS);
781 >        assertFalse(t.isAlive());
782 >    }
783 >
784 >    /**
785 >     * await is interruptible
786 >     */
787 >    public void testAwait_Interrupt() throws InterruptedException {
788 >        final Mutex sync = new Mutex();
789 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
790 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
791 >            public void realRun() throws InterruptedException {
792 >                sync.acquire(1);
793 >                c.await();
794 >            }});
795 >
796 >        t.start();
797 >        Thread.sleep(SHORT_DELAY_MS);
798 >        t.interrupt();
799 >        t.join(SHORT_DELAY_MS);
800 >        assertFalse(t.isAlive());
801 >    }
802 >
803 >    /**
804 >     * awaitNanos is interruptible
805 >     */
806 >    public void testAwaitNanos_Interrupt() throws InterruptedException {
807 >        final Mutex sync = new Mutex();
808 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
809 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
810 >            public void realRun() throws InterruptedException {
811 >                sync.acquire(1);
812 >                c.awaitNanos(MILLISECONDS.toNanos(LONG_DELAY_MS));
813 >            }});
814 >
815 >        t.start();
816 >        Thread.sleep(SHORT_DELAY_MS);
817 >        t.interrupt();
818 >        t.join(SHORT_DELAY_MS);
819 >        assertFalse(t.isAlive());
820 >    }
821 >
822 >    /**
823 >     * awaitUntil is interruptible
824 >     */
825 >    public void testAwaitUntil_Interrupt() throws InterruptedException {
826 >        final Mutex sync = new Mutex();
827 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
828 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
829 >            public void realRun() throws InterruptedException {
830 >                sync.acquire(1);
831 >                java.util.Date d = new java.util.Date();
832 >                c.awaitUntil(new java.util.Date(d.getTime() + 10000));
833 >            }});
834 >
835 >        t.start();
836 >        Thread.sleep(SHORT_DELAY_MS);
837 >        t.interrupt();
838 >        t.join(SHORT_DELAY_MS);
839 >        assertFalse(t.isAlive());
840 >    }
841 >
842 >    /**
843 >     * signalAll wakes up all threads
844 >     */
845 >    public void testSignalAll() throws InterruptedException {
846 >        final Mutex sync = new Mutex();
847 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
848 >        Thread t1 = new Thread(new CheckedRunnable() {
849 >            public void realRun() throws InterruptedException {
850 >                sync.acquire(1);
851 >                c.await();
852 >                sync.release(1);
853 >            }});
854 >
855 >        Thread t2 = new Thread(new CheckedRunnable() {
856 >            public void realRun() throws InterruptedException {
857 >                sync.acquire(1);
858 >                c.await();
859 >                sync.release(1);
860 >            }});
861 >
862 >        t1.start();
863 >        t2.start();
864 >        Thread.sleep(SHORT_DELAY_MS);
865 >        sync.acquire(1);
866 >        c.signalAll();
867 >        sync.release(1);
868 >        t1.join(SHORT_DELAY_MS);
869 >        t2.join(SHORT_DELAY_MS);
870 >        assertFalse(t1.isAlive());
871 >        assertFalse(t2.isAlive());
872 >    }
873 >
874 >
875 >    /**
876 >     * toString indicates current state
877 >     */
878 >    public void testToString() {
879 >        Mutex sync = new Mutex();
880 >        String us = sync.toString();
881 >        assertTrue(us.indexOf("State = 0") >= 0);
882 >        sync.acquire(1);
883 >        String ls = sync.toString();
884 >        assertTrue(ls.indexOf("State = 1") >= 0);
885 >    }
886 >
887 >    /**
888 >     * A serialized AQS deserializes with current state
889 >     */
890 >    public void testSerialization() throws Exception {
891 >        Mutex l = new Mutex();
892 >        l.acquire(1);
893 >        assertTrue(l.isHeldExclusively());
894 >
895 >        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
896 >        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
897 >        out.writeObject(l);
898 >        out.close();
899 >
900 >        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
901 >        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
902 >        Mutex r = (Mutex) in.readObject();
903 >        assertTrue(r.isHeldExclusively());
904 >    }
905 >
906 >
907 >    /**
908 >     * tryReleaseShared setting state changes getState
909 >     */
910 >    public void testGetStateWithReleaseShared() {
911 >        final BooleanLatch l = new BooleanLatch();
912 >        assertFalse(l.isSignalled());
913 >        l.releaseShared(0);
914 >        assertTrue(l.isSignalled());
915 >    }
916 >
917 >    /**
918 >     * releaseShared has no effect when already signalled
919 >     */
920 >    public void testReleaseShared() {
921 >        final BooleanLatch l = new BooleanLatch();
922 >        assertFalse(l.isSignalled());
923 >        l.releaseShared(0);
924 >        assertTrue(l.isSignalled());
925 >        l.releaseShared(0);
926 >        assertTrue(l.isSignalled());
927 >    }
928 >
929 >    /**
930 >     * acquireSharedInterruptibly returns after release, but not before
931 >     */
932 >    public void testAcquireSharedInterruptibly() throws InterruptedException {
933 >        final BooleanLatch l = new BooleanLatch();
934 >
935 >        Thread t = new Thread(new CheckedRunnable() {
936 >            public void realRun() throws InterruptedException {
937 >                assertFalse(l.isSignalled());
938 >                l.acquireSharedInterruptibly(0);
939 >                assertTrue(l.isSignalled());
940 >            }});
941 >
942 >        t.start();
943 >        assertFalse(l.isSignalled());
944 >        Thread.sleep(SHORT_DELAY_MS);
945 >        l.releaseShared(0);
946 >        assertTrue(l.isSignalled());
947 >        t.join();
948 >    }
949 >
950 >
951 >    /**
952 >     * acquireSharedTimed returns after release
953 >     */
954 >    public void testAcquireSharedTimed() throws InterruptedException {
955 >        final BooleanLatch l = new BooleanLatch();
956 >
957 >        Thread t = new Thread(new CheckedRunnable() {
958 >            public void realRun() throws InterruptedException {
959 >                assertFalse(l.isSignalled());
960 >                long nanos = MILLISECONDS.toNanos(MEDIUM_DELAY_MS);
961 >                assertTrue(l.tryAcquireSharedNanos(0, nanos));
962 >                assertTrue(l.isSignalled());
963 >            }});
964 >
965 >        t.start();
966 >        assertFalse(l.isSignalled());
967 >        Thread.sleep(SHORT_DELAY_MS);
968 >        l.releaseShared(0);
969 >        assertTrue(l.isSignalled());
970 >        t.join();
971 >    }
972 >
973 >    /**
974 >     * acquireSharedInterruptibly throws IE if interrupted before released
975 >     */
976 >    public void testAcquireSharedInterruptibly_InterruptedException() throws InterruptedException {
977 >        final BooleanLatch l = new BooleanLatch();
978 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
979 >            public void realRun() throws InterruptedException {
980 >                assertFalse(l.isSignalled());
981 >                l.acquireSharedInterruptibly(0);
982 >            }});
983 >
984 >        t.start();
985 >        assertFalse(l.isSignalled());
986 >        t.interrupt();
987 >        t.join();
988 >    }
989 >
990 >    /**
991 >     * acquireSharedTimed throws IE if interrupted before released
992 >     */
993 >    public void testAcquireSharedNanos_InterruptedException() throws InterruptedException {
994 >        final BooleanLatch l = new BooleanLatch();
995 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
996 >            public void realRun() throws InterruptedException {
997 >                assertFalse(l.isSignalled());
998 >                long nanos = MILLISECONDS.toNanos(SMALL_DELAY_MS);
999 >                l.tryAcquireSharedNanos(0, nanos);
1000 >            }});
1001 >
1002 >        t.start();
1003 >        Thread.sleep(SHORT_DELAY_MS);
1004 >        assertFalse(l.isSignalled());
1005 >        t.interrupt();
1006 >        t.join();
1007 >    }
1008 >
1009 >    /**
1010 >     * acquireSharedTimed times out if not released before timeout
1011 >     */
1012 >    public void testAcquireSharedNanos_Timeout() throws InterruptedException {
1013 >        final BooleanLatch l = new BooleanLatch();
1014 >        Thread t = new Thread(new CheckedRunnable() {
1015 >            public void realRun() throws InterruptedException {
1016 >                assertFalse(l.isSignalled());
1017 >                long nanos = MILLISECONDS.toNanos(SMALL_DELAY_MS);
1018 >                assertFalse(l.tryAcquireSharedNanos(0, nanos));
1019 >            }});
1020 >
1021 >        t.start();
1022 >        Thread.sleep(SHORT_DELAY_MS);
1023 >        assertFalse(l.isSignalled());
1024 >        t.join();
1025 >    }
1026 >
1027   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines