6959259: Minor improvements to static Random field caching
Summary: Cache fields in locals; small javadoc clarifications
Reviewed-by: emcmanus, dholmes, forax, dl
--- a/jdk/src/share/classes/java/lang/Math.java Thu Jun 10 15:54:25 2010 -0700
+++ b/jdk/src/share/classes/java/lang/Math.java Thu Jun 10 15:55:26 2010 -0700
@@ -681,9 +681,9 @@
private static Random randomNumberGenerator;
- private static synchronized void initRNG() {
- if (randomNumberGenerator == null)
- randomNumberGenerator = new Random();
+ private static synchronized Random initRNG() {
+ Random rnd = randomNumberGenerator;
+ return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
}
/**
@@ -694,9 +694,11 @@
*
* <p>When this method is first called, it creates a single new
* pseudorandom-number generator, exactly as if by the expression
- * <blockquote>{@code new java.util.Random}</blockquote> This
- * new pseudorandom-number generator is used thereafter for all
- * calls to this method and is used nowhere else.
+ *
+ * <blockquote>{@code new java.util.Random()}</blockquote>
+ *
+ * This new pseudorandom-number generator is used thereafter for
+ * all calls to this method and is used nowhere else.
*
* <p>This method is properly synchronized to allow correct use by
* more than one thread. However, if many threads need to generate
@@ -705,11 +707,12 @@
*
* @return a pseudorandom {@code double} greater than or equal
* to {@code 0.0} and less than {@code 1.0}.
- * @see java.util.Random#nextDouble()
+ * @see Random#nextDouble()
*/
public static double random() {
- if (randomNumberGenerator == null) initRNG();
- return randomNumberGenerator.nextDouble();
+ Random rnd = randomNumberGenerator;
+ if (rnd == null) rnd = initRNG();
+ return rnd.nextDouble();
}
/**
--- a/jdk/src/share/classes/java/lang/StrictMath.java Thu Jun 10 15:54:25 2010 -0700
+++ b/jdk/src/share/classes/java/lang/StrictMath.java Thu Jun 10 15:55:26 2010 -0700
@@ -667,9 +667,9 @@
private static Random randomNumberGenerator;
- private static synchronized void initRNG() {
- if (randomNumberGenerator == null)
- randomNumberGenerator = new Random();
+ private static synchronized Random initRNG() {
+ Random rnd = randomNumberGenerator;
+ return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
}
/**
@@ -680,9 +680,11 @@
*
* <p>When this method is first called, it creates a single new
* pseudorandom-number generator, exactly as if by the expression
- * <blockquote>{@code new java.util.Random}</blockquote> This
- * new pseudorandom-number generator is used thereafter for all
- * calls to this method and is used nowhere else.
+ *
+ * <blockquote>{@code new java.util.Random()}</blockquote>
+ *
+ * This new pseudorandom-number generator is used thereafter for
+ * all calls to this method and is used nowhere else.
*
* <p>This method is properly synchronized to allow correct use by
* more than one thread. However, if many threads need to generate
@@ -691,11 +693,12 @@
*
* @return a pseudorandom {@code double} greater than or equal
* to {@code 0.0} and less than {@code 1.0}.
- * @see java.util.Random#nextDouble()
+ * @see Random#nextDouble()
*/
public static double random() {
- if (randomNumberGenerator == null) initRNG();
- return randomNumberGenerator.nextDouble();
+ Random rnd = randomNumberGenerator;
+ if (rnd == null) rnd = initRNG();
+ return rnd.nextDouble();
}
/**
--- a/jdk/src/share/classes/java/util/Collections.java Thu Jun 10 15:54:25 2010 -0700
+++ b/jdk/src/share/classes/java/util/Collections.java Thu Jun 10 15:55:26 2010 -0700
@@ -463,10 +463,10 @@
* its list-iterator does not support the <tt>set</tt> operation.
*/
public static void shuffle(List<?> list) {
- if (r == null) {
- r = new Random();
- }
- shuffle(list, r);
+ Random rnd = r;
+ if (rnd == null)
+ r = rnd = new Random();
+ shuffle(list, rnd);
}
private static Random r;