У меня есть необходимость в одном разрешении семафорного объекта в моей программе Java, где есть дополнительный метод получения, который выглядит следующим образом:
boolean tryAcquire(int id)
и ведет себя следующим образом: если идентификатор ранее не встречался, помните об этом, а затем выполняйте все java.util.concurrent.Semaphore
. Если идентификатор был встречен раньше и эта встреча привела к сдаче в аренду разрешения, то придать этому потоку приоритет над всеми другими потоками, которые могут ждать разрешения. Я также хочу использовать дополнительный метод выпуска, например:
void release(int id)
который делает то, что делает java.util.concurrent.Semaphore
, а также "забывает" об идентификаторе.
Я действительно не знаю, как подойти к этому, но вот начало возможной реализации, но я боюсь, что это никуда не будет:
public final class SemaphoreWithMemory {
private final Semaphore semaphore = new Semaphore(1, true);
private final Set<Integer> favoured = new ConcurrentSkipListSet<Integer>();
public boolean tryAcquire() {
return semaphore.tryAcquire();
}
public synchronized boolean tryAcquire(int id) {
if (!favoured.contains(id)) {
boolean gotIt = tryAcquire();
if (gotIt) {
favoured.add(id);
return true;
}
else {
return false;
}
}
else {
// what do I do here???
}
}
public void release() {
semaphore.release();
}
public synchronized void release(int id) {
favoured.remove(id);
semaphore.release();
}
}