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还大的数字(这个能理解)
但是,信号的值还可能为负数,这个就不大能理解了。因为使信号--的方法,是在信号++之后的,怎么可能为负数呢?
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还大的数字(这个能理解)
但是,信号的值还可能为负数,这个就不大能理解了。因为使信号--的方法,是在信号++之后的,怎么可能为负数呢?
比如,--包含了读和写两个操作
这两个操作之间,别的线程闯进来,就会得到负值了。