Пока и делать-пока
Пока и do-while функционально эквивалентны, когда блоки пусты, хотя while кажется более естественным:
do {} while (keepLooping());
while (keepLooping()) {}
Одним из типичных случаев использования while/do-while с пустым блоком является принудительное обновление атомарных объектов с помощью compareAndSet (CAS). Например, приведенный ниже код будет увеличивать a
потокобезопасным способом:
int i;
AtomicInteger a = new AtomicInteger();
while (!a.compareAndSet(i = a.get(), i + 1)) {}
Контекст
Несколько частей java.util.concurrent используют идиому do {} while (...)
для операций CAS, и javadoc ForkJoinPool
объясняет:
Есть несколько вхождений необычного
do {} while (!cas...)
, который является самым простым способом принудительного обновления переменной CAS.
Поскольку они признают, что это необычно, я полагаю, что они имели в виду лучший, а не самый простой.
Вопрос
Существуют ли ситуации, когда do {} while (!cas)
может быть более эффективным, чем while (!cas) {}
, и по каким причинам?
{}
---while (condition);
вот что я написал бы. - person Marko Topolnik   schedule 08.05.2013;
. Я нашел это видео, где Дуг Ли говорит около 57:00 минуты: Не используйте while, используйте do-while из-за точек безопасности, а на слайде упоминается меньшее окно гонки. Я предполагаю, что он ссылается на точки сохранения GC, хотя я не вижу, как это имеет значение здесь. - person assylias   schedule 08.05.2013do/while
могут быть полезны, когда ваш код должен повторить цикл хотя бы один раз и/или когда ваш цикл инициализирует переменную, проверенную внутри условияwhile
. - person Shadow Man   schedule 30.05.2013