Java: ожидание на синхронизированном блоке, кто идет первым?

Этот вопрос вдохновлен другим вопросом.

Если в блоке synchronized ожидает несколько потоков, и блокировка становится доступной, кто идет первым? Является ли это приоритетом потока (а затем первым-первым-первым)?

И применимы ли те же правила для notify (с несколькими wait потоками)?

Ответ 1

По словам этого парня: http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html

Java не дает никаких гарантий относительно последовательности. Поэтому я предполагаю, что он не основан на приоритете потока

Я попытаюсь найти более подробное объяснение того, как Java фактически решает, кто идет первым.

Ответ 2

Кто-то еще упомянул о наличии честных замков. Если вы действительно заботитесь о том, кто идет первым, тогда у вас может возникнуть проблема в реальном времени. В этом случае вы можете использовать RTSJ, в котором задана упорядочивающая и другая семантика обнаружения блокировки. Спецификации доступны в RTSJ Spec в разделе Синхронизация. Цитирование из раздела обоснования:

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

Ответ 3

для вашего второго вопроса

один из них выбран для пробуждения. Выбор произволен и происходит по усмотрению реализации. Нить ждет монитор объекта, вызвав один из методов ожидания.

Из http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify()

Ответ 4

Это зависит от приоритета потока и алгоритма планирования потоков, а также блокировка синхронизированного блока не является "справедливой". Это означает, что если есть 2 ожидающих потока с одним и тем же приоритетом, и первый поток ждет больше, чем второй поток, который не обязательно означает, что первый поток будет выполнен первым.