Настройка справедливости в классе семафора

Я пытаюсь понять полезность свойства fairness в классе Semaphore.

В частности, чтобы указать, что Javadoc упоминает, что:

Как правило, семафоры, используемые для управления доступом к ресурсам, должны быть инициализированы как справедливые, чтобы гарантировать, что ни один поток не будет истощен из доступа к ресурсу. При использовании семафоров для других видов управления синхронизацией пропускная способность несправедливого упорядочения часто перевешивает соображения справедливости.

Может ли кто-нибудь представить пример, где здесь может потребоваться баржи. Я не могу подумать о прошлом случае использования ресурсов. Кроме того, почему это по умолчанию является неправильным поведением?

Наконец, есть ли какие-либо последствия для использования поведения справедливости?

Ответ 1

Конструкции Java concurrency (synchronized, wait(), notify(),...) не определяют, какой поток должен быть освобожден при освобождении блокировки. Решить, какой алгоритм использовать использовать, зависит от реализации JVM.

Справедливость дает вам больше контроля: когда блокировка освобождается, поток с самым длинным временем ожидания получает блокировку (обработка FIFO). Без справедливости (и с очень плохим алгоритмом) может возникнуть ситуация, когда поток всегда ждет блокировки, потому что существует непрерывный поток других потоков.

Если Семафор настроен на справедливость, есть небольшие накладные расходы, потому что ему необходимо поддерживать очередь всех потоков, ожидающих блокировку. Если вы не пишете приложение с высокой пропускной способностью/высокой производительностью/многими ядрами, вы, вероятно, не увидите различий!

Сценарий, в котором справедливость не требуется

Если у вас N одинаковых рабочих потоков, неважно, какой из них получает задача для выполнения

Сценарий, в котором необходима справедливость

Если у вас есть очереди N задач, вы не хотите, чтобы одна очередь ожидала навсегда и никогда не приобретала блокировку.