Java - Как изменить реализацию семафора, чтобы оно было честным
Я реализую SimpleSemaphore, используя ReentrantLock в 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();
}
}
}
1 ответ
Решение
Попробуй это
...
private ReentrantLock lock;
private Condition isZero;
public SimpleSemaphore (int permits, boolean fair) {
mPermits = permits;
lock = new ReentrantLock(fair);
isZero = lock.newCondition();
}