Семафор (int allows, boolean fair), что именно делает справедливость?


Мне нужно реализовать очередь FIFO, если на семафоре нет доступных разрешений. Мой профессор уточнил, что во время экзамена мы сможем использовать только методы acquire() и release(). Моя идея состояла в том, чтобы реализовать LinkedList, используя метод tryAcquire(), который, если результат будет ложным, добавит currentThread в нижней части списка. Не имея возможности использовать метод tryAcquire(), я искал и заметил эту конструкцию. Если я инициализирую семафор, например:

Semaphore example = new Semaphore(5, true);

Что произойдет, если поток пытается использовать метод acquire() на семафоре, который исчерпал свои разрешения? Создает ли он очередь автоматически? Должен ли я каким-либо образом справиться с этим или процесс автоматизирован?

1 4

1 ответ:

Не Ява док явно в этом образе?

Он говорит, что поток, вызывающий acquire, будет заблокирован до тех пор, пока не будет доступно разрешение, в отличие от tryAcquire, которое возвратит false - это означает, что разрешений нет, но поток, вызывающий этот метод, не заблокируется.

Справедливость взаимосвязана. Если есть уже ожидающие потоки, но вы tryAcquire через текущий поток, он проигнорирует справедливость и получит это разрешение. Поскольку вы не можете использовать его, справедливость является Очередь FIFO, которую вы ищете. Буквально от Дока:

Когда справедливость установлена в true, семафор гарантирует, что потоки, вызывающие любой из методов получения, выбираются для получения разрешений в том порядке, в котором был обработан их вызов этих методов (first-in-first-out; FIFO)

Если есть заблокированные потоки, два способа снять блокировку-добавить разрешение через release или прервать поток, что, я думаю, вам не нужно.