В каких ситуациях можно сделать время более эффективным, чем время?
Хотя против делай время
Пока и делай пока функционально эквивалентныкогда блоки пусты, хотя пока кажется более естественным
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 и JavadocForkJoinPool
объясняет:
Есть несколько случаев необычногоdo {} while (!cas...)
что является самым простым способом форсировать обновление CAS 'переменная
Поскольку они признают, что это необычно, я полагаю, они имели в видуЛучший скорее, чемПростейшие.
Вопрос
Есть ли ситуации, когдаdo {} while (!cas)
может быть более эффективным, чемwhile (!cas) {}
а по каким причинам?