У меня есть пример повторяющегося семафора, но он предназначен только для 2 претендентов. Если вы хотите расширить код более чем на 2, вы должны реализовать простой список и внести несколько изменений, включая тест для wait()
в методе aquire()
.
package nmscd.utils;
/**
* A simple, non-reentrant, one permit, FAIR semaphore
* @author cosmo
*/
public class SimpleSemaphore {
private boolean aquired = false;
private Thread currThread;
private Thread releasedThread;
private int pretendersCount = 0;
public synchronized void aquire() throws InterruptedException {
while ((Thread.currentThread() != currThread && aquired) || (pretendersCount > 0 && Thread.currentThread() == releasedThread)) {
pretendersCount++;
try {
wait();
} finally {
pretendersCount--;
}
}
aquired = true;
currThread = Thread.currentThread();
}
public synchronized void release() {
if (Thread.currentThread() == currThread) {
aquired = false;
currThread = null;
releasedThread = Thread.currentThread();
notifyAll();
}
}
}
Ключ в этом классе заключается в том, чтобы проверить в методе aquire, чтобы увидеть, является ли запрашиваемый поток нужным потоком, все остальные потоки должны ждать. Так что, если у вас достаточно информации, чтобы определить этот поток, вы можете выбрать, какой поток возвращает из aquire()