雖然與做,而在什麼情況下可以做到 - 雖然比以前更有效率?
雖然和do-while在功能上等同當塊是空,但同時似乎更自然:一段時間的
do {} while (keepLooping());
while (keepLooping()) {}
一個典型使用案例/ 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操作和ForkJoinPool
javadoc的解釋:
有幾次發生的異常
do {} while (!cas...)
這是強制更新CAS'ed變量的最簡單方法。
因爲他們承認這是不尋常的,我想他們的意思最好而不是簡單。
問題
是否在某些do {} while (!cas)
可以比while (!cas) {}
出於什麼原因,更有效的情況呢?
也許這只是歷史的偏好。無論如何,爲什麼要使用'{}'--- while(condition);'是我寫的。 – 2013-05-08 10:24:30
@MarkoTopolnik在';'上同意。我發現了[這段視頻](Doug Lea在大約57分鐘左右的時候說道)(http://emergingtech.chariotsolutions.com/2013/04/phillyete-screencast-7-doug-lea-engineering-concurrent-library-components/) :「*不要使用while,使用do-while,因爲safepoints *」,並且幻燈片提到「較小的競賽窗口」。我想他提到了GC安全點,儘管我沒有看到它在這裏有什麼不同。 – assylias 2013-05-08 10:41:15
Doug對此很籠統:)我能解釋它的最好方式不是關於do-while和while,而是關於使用循環體進行分配與填充所有條件。 – 2013-05-08 10:56:23