我想在第一次获取信号量后添加一个同步的代码段,我不允许同步该函数。所以我写了以下代码。不幸的是,从输出中,我的程序被阻止了。这是为什么?如果我只能更改P()和V()中的上下文,我应该如何更改代码。
package operating_system;
import java.util.ArrayList ;
public class Semaphore {
private int value ;
private ArrayList <SemProc> queue ;
public Semaphore(int i) {
value = i ;
queue = new ArrayList <SemProc> () ;
}
public synchronized void V() { //release
value++;
if ( value >0 )
return;
else {//someone else is waiting
if ( !queue.isEmpty() ){
SemProc Runner = queue.get(0);
queue.remove(0);
Runner.addToReadyQueue(true);
}
}
}
public void P(SemProc t) { //acquire
synchronized (this){
value--;
if ( value >= 0 )
return;
else { // no available resources
t.removeFromReadyQueue();
queue.add(t);
try {
wait();
} catch (InterruptedException e) {e.printStackTrace();}
}}}}