Синхронизированный блок в Java может вызвать голодание потоков, когда несколько потоков конкурируют за одну и ту же блокировку. Java Virtual Machine не гарантирует, какой поток получит блокировку следующим, создавая непредсказуемые паттерны доступа.
Когда много потоков ждут входа в синхронизированный блок, некоторые потоки могут испытывать неопределённые задержки. Это происходит потому что:
Представь ситуацию, где несколько потоков пытаются получить доступ к общему ресурсу:
synchronized(lock) {
// Критическая секция
// выполняем работу
}
Если потоки с высоким приоритетом часто вызывают этот блок, потоки с низким приоритетом могут никогда не получить достаточно времени CPU, чтобы войти и выполнить свою работу, в результате чего возникает голодание.
Чтобы снизить голодание потоков, рассмотри:
java.util.concurrent вроде ReentrantLock с политиками справедливости (fairness)Фундаментальная проблема в том, что стандартные synchronized блоки ставят доступность блокировки выше справедливости, что делает их уязвимыми к голоданию в условиях высокой конкуренции.
Java-блоки synchronized гарантируют, что потоки захватывают блокировки в порядке FIFO, предотвращая голодание при высокой конкуренции.
Новый — ещё не проверен сообществом
Вы