Java: ожидание синхронизированного блока, кто идет первым? - PullRequest
12 голосов
/ 15 октября 2010

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

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

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

Ответы [ 4 ]

9 голосов
/ 15 октября 2010

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

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

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

5 голосов
/ 19 октября 2010

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

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

1 голос
/ 15 октября 2010

за ваш второй вопрос

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

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

0 голосов
/ 15 октября 2010

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

...