Что определяет, какой из двух конкурирующих потоков получает блокировку? - PullRequest
5 голосов
/ 11 февраля 2012

Когда два потока пытаются получить блокировку одного и того же объекта, какие вещи, как считается, решают, какому потоку следует передать блокировку.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

Согласно документации Java для notify () :

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

Таким образом, если вы используете synchronized(obj){}, у вас практически нет контроля над тем, какой поток получит блокировку на obj, и вы не можете делать никаких предположений. Это зависит от планировщика.

Если вам нужна справедливость (то есть следующий поток, получающий блокировку, является первым в очереди), взгляните на ReentrantLock : у него есть логический флаг, указывающий, что вы хотите применить справедливость.

0 голосов
/ 11 февраля 2012

Согласно Java Oracle Docs :

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

Если вы разрешаете честность, тогда используется FIFO (первым пришел-первым вышел), в противном случае он кажется случайным (из моих наблюдений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...