From 72ec2d876a1bdc67936fe0530260bfc040c79fc1 Mon Sep 17 00:00:00 2001 From: Martin Buchholz Date: Wed, 2 Jun 2010 17:53:54 -0700 Subject: [PATCH] 6955840: ThreadLocalRandom bug - overriden setSeed(long) method is not invoked for java.util.Random(long) Allow setSeed only during construction Reviewed-by: dl, dholmes --- .../java/util/concurrent/ThreadLocalRandom.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/jdk/src/share/classes/java/util/concurrent/ThreadLocalRandom.java b/jdk/src/share/classes/java/util/concurrent/ThreadLocalRandom.java index ba83c80a779..c8a67dd6510 100644 --- a/jdk/src/share/classes/java/util/concurrent/ThreadLocalRandom.java +++ b/jdk/src/share/classes/java/util/concurrent/ThreadLocalRandom.java @@ -73,10 +73,10 @@ public class ThreadLocalRandom extends Random { private long rnd; /** - * Initialization flag to permit the first and only allowed call - * to setSeed (inside Random constructor) to succeed. We can't - * allow others since it would cause setting seed in one part of a - * program to unintentionally impact other usages by the thread. + * Initialization flag to permit calls to setSeed to succeed only + * while executing the Random constructor. We can't allow others + * since it would cause setting seed in one part of a program to + * unintentionally impact other usages by the thread. */ boolean initialized; @@ -98,11 +98,10 @@ public class ThreadLocalRandom extends Random { /** * Constructor called only by localRandom.initialValue. - * We rely on the fact that the superclass no-arg constructor - * invokes setSeed exactly once to initialize. */ ThreadLocalRandom() { super(); + initialized = true; } /** @@ -123,7 +122,6 @@ public class ThreadLocalRandom extends Random { public void setSeed(long seed) { if (initialized) throw new UnsupportedOperationException(); - initialized = true; rnd = (seed ^ multiplier) & mask; }