Замки в классе Java - PullRequest
       16

Замки в классе Java

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

предположим, у нас есть следующий пример кода:

while(some condition){
    lock1.lock();
    .
    .
}

вопрос:

предположим, что условие цикла while завершается для некоторого потока, работающего над этой частью кода, и lock1 доступен, возможно ли, что поток проверит состояние цикла, но все еще не получит блокировку?

или в этом случае гарантируется, что если условие проверено, поток получает блокировку?

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Короче говоря: да, это возможно.

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

Помните, что у вас нет возможности узнать, как два или более одновременно выполняющихся потока чередуют выполнение своих команд. Предположим, два потока, A и B, выполняют этот код. Если поток A находит условие истинным, возможно, что он получает прерванный (снимается с ЦП планировщиком ОС) перед фактическим установлением блокировки (то есть между оценкой условия while и вызовом lock()), поэтому поток B также находит условие true, принимает блокировку, а поток A. остается в ожидании.

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

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

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