@Override
 public void initialize() {
   sync = new Mutex();
   assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
   sync.acquire(1);
   assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
 }
    public void thread3() {
      waitForTick(1);
      assertTrue(sync.getExclusiveQueuedThreads().contains(getThread(1)));

      waitForTick(3);
      assertTrue(sync.getExclusiveQueuedThreads().contains(getThread(1)));
      assertTrue(sync.getExclusiveQueuedThreads().contains(getThread(2)));
      getThread(1).interrupt();

      waitForTick(4);
      assertFalse(sync.getExclusiveQueuedThreads().contains(getThread(1)));
      assertTrue(sync.getExclusiveQueuedThreads().contains(getThread(2)));
      sync.release(1);
    }
 /** getExclusiveQueuedThreads returns all exclusive waiting threads */
 public void testGetExclusiveQueuedThreads() {
   final Mutex sync = new Mutex();
   Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
   Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
   assertHasExclusiveQueuedThreads(sync, NO_THREADS);
   sync.acquire();
   assertHasExclusiveQueuedThreads(sync, NO_THREADS);
   t1.start();
   waitForQueuedThread(sync, t1);
   assertHasExclusiveQueuedThreads(sync, t1);
   assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
   assertFalse(sync.getExclusiveQueuedThreads().contains(t2));
   t2.start();
   waitForQueuedThread(sync, t2);
   assertHasExclusiveQueuedThreads(sync, t1, t2);
   assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
   assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
   t1.interrupt();
   awaitTermination(t1);
   assertHasExclusiveQueuedThreads(sync, t2);
   sync.release();
   awaitTermination(t2);
   assertHasExclusiveQueuedThreads(sync, NO_THREADS);
 }
 @Override
 public void finish() {
   assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
 }