diff options
author | shade <unknown> | 2019-07-05 16:22:19 +0200 |
---|---|---|
committer | bell-sw <liberica@bell-sw.com> | 2019-10-24 17:19:40 +0300 |
commit | 9dcafafe948f5cd63429dd93a90ea3c401c1a62f (patch) | |
tree | 9092479a6a7129904ecc11ff0bfd45e603842954 /src/share/classes/java | |
parent | 70d9d253f682fbfcd7c6fd092754ff223962ba32 (diff) | |
download | jdk8u_jdk-9dcafafe948f5cd63429dd93a90ea3c401c1a62f.tar.gz |
8227018: CompletableFuture should not call Runtime.availableProcessors on fast path
Reviewed-by: dl, martin
Diffstat (limited to 'src/share/classes/java')
-rw-r--r-- | src/share/classes/java/util/concurrent/CompletableFuture.java | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/share/classes/java/util/concurrent/CompletableFuture.java b/src/share/classes/java/util/concurrent/CompletableFuture.java index 955daabedc..d645bb4c39 100644 --- a/src/share/classes/java/util/concurrent/CompletableFuture.java +++ b/src/share/classes/java/util/concurrent/CompletableFuture.java @@ -421,6 +421,20 @@ public class CompletableFuture<T> implements Future<T>, CompletionStage<T> { static final int ASYNC = 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 -------------- */ @SuppressWarnings("serial") @@ -1709,8 +1723,7 @@ public class CompletableFuture<T> implements Future<T>, CompletionStage<T> { Object r; while ((r = result) == null) { if (spins < 0) - spins = (Runtime.getRuntime().availableProcessors() > 1) ? - 1 << 8 : 0; // Use brief spin-wait on multiprocessors + spins = SPINS; else if (spins > 0) { if (ThreadLocalRandom.nextSecondarySeed() >= 0) --spins; |