Ответ 1
Конструкции Java concurrency (synchronized
, wait()
, notify()
,...) не определяют, какой поток должен быть освобожден при освобождении блокировки. Решить, какой алгоритм использовать использовать, зависит от реализации JVM.
Справедливость дает вам больше контроля: когда блокировка освобождается, поток с самым длинным временем ожидания получает блокировку (обработка FIFO). Без справедливости (и с очень плохим алгоритмом) может возникнуть ситуация, когда поток всегда ждет блокировки, потому что существует непрерывный поток других потоков.
Если Семафор настроен на справедливость, есть небольшие накладные расходы, потому что ему необходимо поддерживать очередь всех потоков, ожидающих блокировку. Если вы не пишете приложение с высокой пропускной способностью/высокой производительностью/многими ядрами, вы, вероятно, не увидите различий!
Сценарий, в котором справедливость не требуется
Если у вас N одинаковых рабочих потоков, неважно, какой из них получает задача для выполнения
Сценарий, в котором необходима справедливость
Если у вас есть очереди N задач, вы не хотите, чтобы одна очередь ожидала навсегда и никогда не приобретала блокировку.