提交 9d83225b 编写于 作者: S shade

8227018: CompletableFuture should not call Runtime.availableProcessors on fast path

Reviewed-by: dl, martin
上级 b2516cd6
...@@ -421,6 +421,20 @@ public class CompletableFuture<T> implements Future<T>, CompletionStage<T> { ...@@ -421,6 +421,20 @@ public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
static final int ASYNC = 1; static final int ASYNC = 1;
static final int NESTED = -1; static final int NESTED = -1;
/**
* Spins before blocking in waitingGet.
* There is no need to spin on uniprocessors.
*
* Call to Runtime.availableProcessors is expensive, cache the value here.
* This unfortunately relies on the number of available CPUs during first
* initialization. This affects the case when MP system would report only
* one CPU available at startup, initialize SPINS to 0, and then make more
* CPUs online. This would incur some performance penalty due to less spins
* than would otherwise happen.
*/
private static final int SPINS = (Runtime.getRuntime().availableProcessors() > 1 ?
1 << 8 : 0);
/* ------------- Base Completion classes and operations -------------- */ /* ------------- Base Completion classes and operations -------------- */
@SuppressWarnings("serial") @SuppressWarnings("serial")
...@@ -1709,8 +1723,7 @@ public class CompletableFuture<T> implements Future<T>, CompletionStage<T> { ...@@ -1709,8 +1723,7 @@ public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
Object r; Object r;
while ((r = result) == null) { while ((r = result) == null) {
if (spins < 0) if (spins < 0)
spins = (Runtime.getRuntime().availableProcessors() > 1) ? spins = SPINS;
1 << 8 : 0; // Use brief spin-wait on multiprocessors
else if (spins > 0) { else if (spins > 0) {
if (ThreadLocalRandom.nextSecondarySeed() >= 0) if (ThreadLocalRandom.nextSecondarySeed() >= 0)
--spins; --spins;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册