code: // from gee.cs.oswego.edu/home/jsr166/jsr166
  
  package jsr166tests.loops;
  
  /*
   * Written by Doug Lea with assistance from members of JCP JSR-166
   * Expert Group and released to the public domain, as explained at
   * http://creativecommons.org/licenses/publicdomain
   */
  
  import java.util.*;
  import java.util.concurrent.*;
  import java.util.concurrent.locks.*;
  import java.util.concurrent.atomic.*;
  import java.io.*;
  
  /**
   * A sample user extension of AbstractQueuedSynchronizer.
   */
  public final class Mutex extends AbstractQueuedSynchronizer implements Lock, java.io.Serializable {
      public boolean isHeldExclusively() { return getState() == 1; }
  
      public boolean tryAcquire(int acquires) {
          return compareAndSetState(0, 1);
      }
  
      public boolean tryRelease(int releases) {
          setState(0);
          return true;
      }
      public Condition newCondition() { return new ConditionObject(); }
  
      private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
          s.defaultReadObject();
          setState(0); // reset to unlocked state
      }
  
      public void lock() {
          acquire(1);
      }
      public boolean tryLock() {
          return tryAcquire(1);
      }
      public void lockInterruptibly() throws InterruptedException {
          acquireInterruptibly(1);
      }
      public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
          return tryAcquireNanos(1, unit.toNanos(timeout));
      }
      public void unlock() { release(1); }
  }
  