aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/java
diff options
context:
space:
mode:
authorshade <unknown>2019-07-05 16:22:19 +0200
committerbell-sw <liberica@bell-sw.com>2019-10-24 17:19:40 +0300
commit9dcafafe948f5cd63429dd93a90ea3c401c1a62f (patch)
tree9092479a6a7129904ecc11ff0bfd45e603842954 /src/share/classes/java
parent70d9d253f682fbfcd7c6fd092754ff223962ba32 (diff)
downloadjdk8u_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.java17
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;