Php: в чем разница между while и hellip; endween; и белый {// материал здесь}

При использовании механизма wait / notify важны безопасность и жизнеспособность. Свойство безопасности требует, чтобы все объекты поддерживали согласованные состояния в многопоточной среде. Свойство liveness требует, чтобы каждая операция или вызов метода выполнялись до завершения без прерывания.

Чтобы гарантировать жизнеспособность, программы должны проверить условие цикла while перед вызовом метода wait (). Этот ранний тест проверяет, удовлетворил ли другой поток предикату условия и отправил уведомление. Вызов метода wait () после отправки уведомления приводит к неопределенной блокировке.

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

Thread in the middle: третий поток может получить блокировку на совместно используемый объект в течение интервала между отправленным уведомлением и возобновляющим приемом принимающего потока. Этот третий поток может изменить состояние объекта, оставив его непоследовательным. Это состояние времени проверки, времени использования (TOCTOU).

Вредоносные уведомления: случайное или злонамеренное уведомление может быть получено, когда предикат условия является ложным. Такое уведомление отменяет метод wait ().

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

Подчиненные пробуждения. Некоторые реализации Java Virtual Machine (JVM) уязвимы для ложных пробуждений, которые приводят к тому, что ожидание потоков просыпается даже без уведомления.

По этим причинам программы должны проверять предикат условия после возврата метода wait (). Цикл while - лучший выбор для проверки предиката условия как до, так и после вызова wait ().

Аналогичным образом, метод await () интерфейса Condition также должен быть вызван внутри цикла. В соответствии с Java API, Условие интерфейса

При ожидании условия, допускается «ложное пробуждение», в общем, как уступка семантике базовой платформы. Это практически не влияет на большинство прикладных программ, поскольку условие всегда следует ждать в цикле, проверяя предикат состояния, которого ждут. Реализация бесплатна для устранения возможности ложных пробуждений, но рекомендуется, чтобы программисты приложений всегда предполагали, что они могут встречаться, и поэтому всегда ждут в цикле.

Новый код должен использовать java. util.concurrent.locks. Утилиты параллелизма вместо механизма wait / notify. Однако устаревший код, соответствующий другим требованиям этого правила, может зависеть от механизма ожидания / уведомления.

Пример несовместимого кода Этот пример несовместимого кода вызывает метод wait () внутри традиционного блока if и после проверки уведомления не проверяется послесловие. Если уведомление было случайным или злонамеренным, поток может просыпаться преждевременно.

synchronized (object) {
  if (<condition does not hold>) {
    object.wait();
  }
  // Proceed when condition holds
}

Соответствующее решение Это совместимое решение вызывает метод wait () из цикла while, чтобы проверить состояние как до, так и после call to wait ():

synchronized (object) {
  while (<condition does not hold>) {
    object.wait();
  }
  // Proceed when condition holds
}

Вызов метода java.util.concurrent.locks.Condition.await () также должен быть заключен в аналогичный цикл.

23
задан redconservatory 10 January 2011 в 20:05
поделиться

4 ответа

Функциональной разницы нет.

На практике я нахожу, что:

while (expression):
// do stuff
endwhile;

более читабельно для дизайнеров, когда вы встраиваете php-код в html. IE:

<? while ($cssClass = array_pop($array)): ?>
   <li class="<?=$cssClass?>">
<? endwhile; ?>

Принимая во внимание, что:

while {

}

Более читабельно в кодовом блоке php.

38
ответ дан Jeff Davis 10 January 2011 в 20:05
поделиться

Нет разницы, все сводится к личным предпочтениям.

6
ответ дан Sebastian Motraghi 10 January 2011 в 20:05
поделиться

Нет никакой разницы при написании кода.

Может быть разница в уровнях удобства в очень особых обстоятельствах. Например, предположим, что вы пишете шаблонизатор, который преобразует код шаблона в собственный код PHP, который затем кэшируется и выполняется непосредственно для скорости.

В данном случае тот факт, что while ... endwhile; избегание использования фигурных скобок может позволить вам упростить алгоритм анализа, например, если он распознает переменные, которые должны быть заменены синтаксисом, подобным {$var}, который также использует фигурные скобки.

Конечно, это действительно небольшое преимущество в действительно необычной ситуации, но вы берете все, что можете. :)

2
ответ дан Jon 10 January 2011 в 20:05
поделиться

Разница незначительна, когда код выполняется на самом деле, но при кодировании я обнаружил, что ввод скобок: (1): быстрее, (2): более условно и (3): позволяет меньше шансов на ошибку (конец) кто-нибудь?).

В качестве бонуса редактор, который я использую, автоматически форматирует циклы while (со скобками, по умолчанию) и в будущем, если что-то не так, встроенная функция сопоставления скобок поймает его.

2
ответ дан Brandon Lee 10 January 2011 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: