Fair lock — это механизм синхронизации в многопоточности, который гарантирует, что потоки получают блокировки в том порядке, в котором их запросили. Это предотвращает ситуацию, когда один поток бесконечно долго ждёт, а другие постоянно получают доступ к общим ресурсам.
Java предоставляет класс ReentrantLock для реализации fair lock'ов. Класс принимает параметр fairness, который при установке в true гарантирует, что поток, дольше всех ждущий, получит блокировку следующим.
Главное достоинство fair lock'ов — предотвращение голодания потоков. Поскольку потоки обслуживаются в предсказуемом порядке, каждый поток в конечном счёте получит блокировку, независимо от того, сколько других потоков конкурируют за неё.
Хотя fair lock'и решают проблему голодания потоков, они несут ощутимые потери производительности:
Метод tryLock() у ReentrantLock не зависит от параметра fairness. Этот метод пытается захватить блокировку без ожидания и не соблюдает гарантию справедливости.
Fair lock'и лучше всего подходят для сценариев, где:
Для высокопроизводительных приложений, где справедливость не критична, несправедливая блокировка может дать лучшую производительность.
Справедливая ReentrantLock гарантирует, что поток, ждущий дольше всех, получит блокировку следующим, что полностью исключает возможность голодания потока.
Новый — ещё не проверен сообществом
Вы