如何在使用信号量时确保线程安全

时间:2015-10-26 19:19:15

标签: thread-safety semaphore synchronized java-threads

我想在第一次获取信号量后添加一个同步的代码段,我不允许同步该函数。所以我写了以下代码。不幸的是,从输出中,我的程序被阻止了。这是为什么?如果我只能更改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();}
   }}}}

0 个答案:

没有答案