2014-04-30 2 views
2

Java에서 ReentrantLock을 사용하여 SimpleSemaphore를 구현하고 있습니다.Java - 세마포어 구현을 수정하여 공정하게 처리하는 방법

이제 생성자에 정의 된대로 공정한 플래그를 추가하여 공정한 불공정 세마포로 만들려고합니다.

내 SimpleSemaphore 코드는 다음과 같습니다. 공정성 구현을 시작하는 방법에 대한 몇 가지 정보를 알려 드리겠습니다. 고맙습니다.

import java.util.concurrent.locks.ReentrantLock; 
import java.util.concurrent.locks.Condition; 

/** 
* @class SimpleSemaphore 
* 
* @brief This class provides a simple counting semaphore 
*  implementation using Java a ReentrantLock and a 
*  ConditionObject. It must implement both "Fair" and 
*  "NonFair" semaphore semantics, just liked Java Semaphores. 
*/ 
public class SimpleSemaphore { 
    private int mPermits; 
    private ReentrantLock lock = new ReentrantLock(); 
    private Condition isZero = lock.newCondition(); 

    /** 
    * Constructor initialize the data members. 
    */ 
    public SimpleSemaphore (int permits, 
          boolean fair) 
    { 
     mPermits = permits; 
    } 

    /** 
    * Acquire one permit from the semaphore in a manner that can 
    * be interrupted. 
    */ 
    public void acquire() throws InterruptedException { 
     lock.lock(); 
     while (mPermits == 0) 
      isZero.await(); 
     mPermits--; 
     lock.unlock(); 
    } 

    /** 
    * Acquire one permit from the semaphore in a manner that 
    * cannot be interrupted. 
    */ 
    public void acquireUninterruptibly() { 
     lock.lock(); 
     while (mPermits == 0) 
      try { 
       isZero.await(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     mPermits--; 
     lock.unlock(); 
    } 

    /** 
    * Return one permit to the semaphore. 
    */ 
    void release() { 
     lock.lock(); 
     try { 
      mPermits++; 
      isZero.signal(); 
     } finally { 
      lock.unlock(); 
     } 
    } 
} 

답변

3

... 
    private ReentrantLock lock; 
    private Condition isZero; 

    public SimpleSemaphore (int permits, boolean fair) { 
     mPermits = permits; 
     lock = new ReentrantLock(fair); 
     isZero = lock.newCondition(); 
    } 
+0

매우 감사하십시오! 내 인수 및 획득 무중단 메서드는 괜찮습니까? 그들은 꽤 많이 똑같아서 내가 여기서 잘하고 있는지 확신 할 수 없었습니다. – DanielY

+0

acquireuninterruptibly()에 Lock.awaitUninterruptibly()를 사용했습니다. –

+0

고마워요! :) ... – DanielY