Какой поток получит блокировку? - PullRequest
5 голосов
/ 17 октября 2010

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

Спасибо

Ответы [ 2 ]

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

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

Согласно этой статье спецификация JVM не накладывает никаких ограничений на справедливость:

Честность
Модель памяти Java не определяет каких-либо требований справедливости для потоков или вытесняющей многопоточности. Поток может отказаться передавать ЦП другому потоку и поставить систему в тупик. Правила справедливости по отношению к другим потокам определяются отдельными реализациями JVM.

То есть, если вы тщательно не синхронизируете свою программу, один поток теоретически может потерять планировщик.

2 голосов
/ 17 октября 2010

Дело в том, что не существует такого понятия, как «в одно и то же время».Один из двух получит блокировку, но у вас нет возможности узнать, какой именно.

Не существует такой вещи "в то же время", потому что, в широком смысле, блокировка - это нечто , который выбирает и выполняет потоки исключительно по одному.

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

...