W jakich sytuacjach może być skuteczniejszy niż kiedyś?
Podczas gdy vs. do-while
Podczas gdy i do-while są funkcjonalnie równoważnekiedy bloki są puste, choć wydaje się bardziej naturalny:
do {} while (keepLooping());
while (keepLooping()) {}
Jednym z typowych przypadków użycia while / do-while z pustym blokiem jest wymuszenie aktualizacji obiektów atomowych za pomocą compareAndSet (CAS). Na przykład poniższy kod będzie się zwiększała
w sposób bezpieczny dla wątków:
int i;
AtomicInteger a = new AtomicInteger();
while (!a.compareAndSet(i = a.get(), i + 1)) {}
Kontekst
Kilka części java.util.concurrent używado {} while (...)
idiom dla operacji CAS i javadoc ofForkJoinPool
wyjaśnia:
Istnieje kilka zdarzeń niezwykłychdo {} while (!cas...)
co jest najprostszym sposobem wymuszenia aktualizacji zmiennej CAS.
Ponieważ przyznają, że to niezwykłe, przypuszczam, że mieli na myśliNajlepiej zamiastnajprostszy.
Pytanie
Czy są sytuacje, w którychdo {} while (!cas)
może być bardziej wydajny niżwhile (!cas) {}
iz jakich powodów?