background image

要真正理解如何解决线程资源共享冲突的问题,还真有点复杂,但是这个又是线程的精
华所在,也是线程中最重要的知识,我要尽力讲清楚它,因此内容比较多了。

想表现线程抢占资源时候所发生的资源冲突问题,不知道大家真的看明白了那段代码的
意思吗?反正我对这段代码琢磨了半天才领悟了其中的含义。这里我还是先把前面那段代
码贴出来:
package cn.com.sxia;

public class Semaphore implements Invariant {
    
    private volatile int semaphore = 0;
    
    public void acquire(){
        ++semaphore;
    }
    
    public boolean available(){
        return semaphore == 0;
    }
    
    public void release(){
        --semaphore;
    }

    @Override
    public InvariantState invariant() {
        int val = semaphore;
        if (val == 0 || val == 1){
            return new InvariantOK();
        }else{
            return new InvariantFailure(new Integer(val));
        }
    }

}
  在 main 函数里我们创建了两个 SemaphoreTester 对象,也就是启动了两个线程,
两个线程操作的是同一个 Semaphore 对象,换句话说操作的是同一个资源了,我们不
断运行 main 函数监控程序总会打印出一次失败的信息,比如下面的信息:
Invariant violated: -1
   我们再看看所写的代码,我们改写下程序,我们没有启动两个线程,只启动了一个
Semaphore 线 程 时 候 , SemaphoreTester 里 的 run 方 法 使 得 Semaphore 里 的
semaphore 的值总不会变成非 0 或 1 的数值,那么监控的程序也就不会报出我们失败
信息来。那么到底是什么原因产生了失败了?
  原因在于一个线程可能从对 available()的调用中返回真,但是当此线程调用