2013-07-04 1 views
2

Я реализует замок блокировки файла в Java, и при попытке получить блокировку у меня есть блок кода что-то вроде этого:Thread.sleep или выход при опросе в Java

while(!fileLockIsAcquired()) 
{ 
    Thread.sleep(100); //is this cool? 
    tryAcquireFileLock(); 
} 

Это значение 100 миллисекунды кажутся слишком жесткими для меня, и мне интересно, не планировал ли планировщик быть более умным, если бы использовал Thread.sleep(0) или Thread.yield(). Похоже, мне кажется, что я лучше сообщаю намерения, но я не уверен, что полностью понимаю, как это интерпретируется JVM. Является ли один вариант лучше, чем другой?

Файл является удаленным файлом, доступ к которому осуществляется через веб-сервис, который не имеет метода блокировки блокировки, поэтому я должен реализовать блокировку самостоятельно.

+1

Почему бы не просто заблокировать? Вы не справляетесь с чем-либо полезным путем блокировки спина. – EJP

+0

'yield' не имеет полезной семантики; он имел смысл в дни перед Java 1.3, когда на некоторых платформах JVM по-прежнему использовал зеленые потоки. –

+0

@EJP это на самом деле блокировка файла с несколькими процессами. Я отредактировал вопрос, чтобы уточнить. – MikeFHay

ответ

3

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

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

0

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

+0

Хороший ответ, но в моем случае это фактически блокировка файла, которая может быть приобретена другим процессом. Я отредактирую вопрос, чтобы уточнить. – MikeFHay

Смежные вопросы