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?

questionAnswers(3)

yourAnswerToTheQuestion