У меня есть необходимость в одном разрешении семафорного объекта в моей программе 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();
    }
}
