1 |
|
/* |
2 |
|
* Written by Doug Lea with assistance from members of JCP JSR-166 |
3 |
|
* Expert Group and released to the public domain, as explained at |
4 |
< |
* http://creativecommons.org/licenses/publicdomain |
4 |
> |
* http://creativecommons.org/publicdomain/zero/1.0/ |
5 |
|
*/ |
6 |
|
|
7 |
|
package jsr166y; |
34 |
|
*/ |
35 |
|
public class ThreadLocalRandom extends Random { |
36 |
|
// same constants as Random, but must be redeclared because private |
37 |
< |
private final static long multiplier = 0x5DEECE66DL; |
38 |
< |
private final static long addend = 0xBL; |
39 |
< |
private final static long mask = (1L << 48) - 1; |
37 |
> |
private static final long multiplier = 0x5DEECE66DL; |
38 |
> |
private static final long addend = 0xBL; |
39 |
> |
private static final long mask = (1L << 48) - 1; |
40 |
|
|
41 |
|
/** |
42 |
|
* The random seed. We can't use super.seed. |
44 |
|
private long rnd; |
45 |
|
|
46 |
|
/** |
47 |
< |
* Initialization flag to permit the first and only allowed call |
48 |
< |
* to setSeed (inside Random constructor) to succeed. We can't |
49 |
< |
* allow others since it would cause setting seed in one part of a |
50 |
< |
* program to unintentionally impact other usages by the thread. |
47 |
> |
* Initialization flag to permit calls to setSeed to succeed only |
48 |
> |
* while executing the Random constructor. We can't allow others |
49 |
> |
* since it would cause setting seed in one part of a program to |
50 |
> |
* unintentionally impact other usages by the thread. |
51 |
|
*/ |
52 |
|
boolean initialized; |
53 |
|
|
69 |
|
|
70 |
|
/** |
71 |
|
* Constructor called only by localRandom.initialValue. |
72 |
– |
* We rely on the fact that the superclass no-arg constructor |
73 |
– |
* invokes setSeed exactly once to initialize. |
72 |
|
*/ |
73 |
|
ThreadLocalRandom() { |
74 |
|
super(); |
75 |
+ |
initialized = true; |
76 |
|
} |
77 |
|
|
78 |
|
/** |
93 |
|
public void setSeed(long seed) { |
94 |
|
if (initialized) |
95 |
|
throw new UnsupportedOperationException(); |
97 |
– |
initialized = true; |
96 |
|
rnd = (seed ^ multiplier) & mask; |
97 |
|
} |
98 |
|
|
107 |
|
* |
108 |
|
* @param least the least value returned |
109 |
|
* @param bound the upper bound (exclusive) |
110 |
+ |
* @return the next value |
111 |
|
* @throws IllegalArgumentException if least greater than or equal |
112 |
|
* to bound |
114 |
– |
* @return the next value |
113 |
|
*/ |
114 |
|
public int nextInt(int least, int bound) { |
115 |
|
if (least >= bound) |