要真正理解如何解决线程资源共享冲突的问题,还真有点复杂,但是这个又是线程的精
华所在,也是线程中最重要的知识,我要尽力讲清楚它,因此内容比较多了。
想表现线程抢占资源时候所发生的资源冲突问题,不知道大家真的看明白了那段代码的
意思吗?反正我对这段代码琢磨了半天才领悟了其中的含义。这里我还是先把前面那段代
码贴出来:
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()的调用中返回真,但是当此线程调用