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();
}
}
}
매우 감사하십시오! 내 인수 및 획득 무중단 메서드는 괜찮습니까? 그들은 꽤 많이 똑같아서 내가 여기서 잘하고 있는지 확신 할 수 없었습니다. – DanielY
acquireuninterruptibly()에 Lock.awaitUninterruptibly()를 사용했습니다. –
고마워요! :) ... – DanielY