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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines