public class SemaphoreTester extends Thread {
  private volatile Semaphore semaphore;
  public SemaphoreTester(Semaphore semaphore) {
    this.semaphore = semaphore;
    setDaemon(true);
    start();
  }
  public void run() {
    while(true)
      if(semaphore.available()) {
        yield(); // Makes it fail faster
        semaphore.acquire();
        yield();
        semaphore.release();
        yield();
      }
  }
  public static void main(String[] args) throws Exception {
    Semaphore sem = new Semaphore();
    new SemaphoreTester(sem);
    new SemaphoreTester(sem);
    new InvariantWatcher(sem).join();
  }

在main()里创建了两个线程,都对信号sem进行操作,
操作通过availabe() //判断信号是否为0,为0则是availabe的,
acquire()//取得信号,通过++实现,
release()//释放信号,通过--实现
线程1和线程2可能同时以为信号availabe,从而取得信号,使信号的值为比1还大的数字(这个能理解)
但是,信号的值还可能为负数,这个就不大能理解了。因为使信号--的方法,是在信号++之后的,怎么可能为负数呢?