2012-02-04 2 views
0

предположат, что мы имеем этот следующий пример код:Замков в Java классе

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

возникает вопрос:

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

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

+0

Сильно зависит от реализации lock(). –

+0

Когда вы говорите «если условие проверено», вы имеете в виду, если условие истинно или если оно просто прочитано? 'lock1.lock()' будет достигнуто только в том случае, если условие истинно. – someguy

ответ

1

Вкратце: Да, это возможно.

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

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

+0

Я написал, что предположим, что lock1 доступен ... –

+0

@Anatoly Libman: Проверьте мое редактирование для расширенного объяснения. – Tudor

+0

спасибо! что я думал, но я хотел убедиться, что 100% –

0

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