changeset 13633:31d3c2937dcb

8227018: CompletableFuture should not call Runtime.availableProcessors on fast path Reviewed-by: dl, martin
author shade
date Fri, 05 Jul 2019 16:22:19 +0200
parents bc278b0ebfad
children 6e1a1f54e7ef
files src/share/classes/java/util/concurrent/CompletableFuture.java
diffstat 1 files changed, 15 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/util/concurrent/CompletableFuture.java	Thu Jun 27 10:52:26 2019 +0200
+++ b/src/share/classes/java/util/concurrent/CompletableFuture.java	Fri Jul 05 16:22:19 2019 +0200
@@ -421,6 +421,20 @@
     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 @@
         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;