History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/util/concurrent/ThreadLocalRandom.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/util/concurrent/ThreadLocalRandom.java+226−0
@@ -0,0 +1,226 @@
1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation. Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/*
26 * This file is available under and governed by the GNU General Public
27 * License version 2 only, as published by the Free Software Foundation.
28 * However, the following notice accompanied the original version of this
29 * file:
30 *
31 * Written by Doug Lea with assistance from members of JCP JSR-166
32 * Expert Group and released to the public domain, as explained at
33 * http://creativecommons.org/publicdomain/zero/1.0/
34 */
35
36package java.util.concurrent;
37
38import java.util.Random;
39
40/**
41 * A random number generator isolated to the current thread. Like the
42 * global {@link java.util.Random} generator used by the {@link
43 * java.lang.Math} class, a {@code ThreadLocalRandom} is initialized
44 * with an internally generated seed that may not otherwise be
45 * modified. When applicable, use of {@code ThreadLocalRandom} rather
46 * than shared {@code Random} objects in concurrent programs will
47 * typically encounter much less overhead and contention. Use of
48 * {@code ThreadLocalRandom} is particularly appropriate when multiple
49 * tasks (for example, each a {@link ForkJoinTask}) use random numbers
50 * in parallel in thread pools.
51 *
52 * <p>Usages of this class should typically be of the form:
53 * {@code ThreadLocalRandom.current().nextX(...)} (where
54 * {@code X} is {@code Int}, {@code Long}, etc).
55 * When all usages are of this form, it is never possible to
56 * accidently share a {@code ThreadLocalRandom} across multiple threads.
57 *
58 * <p>This class also provides additional commonly used bounded random
59 * generation methods.
60 *
61 * @since 1.7
62 * @author Doug Lea
63 */
64public class ThreadLocalRandom extends Random {
65 // same constants as Random, but must be redeclared because private
66 private static final long multiplier = 0x5DEECE66DL;
67 private static final long addend = 0xBL;
68 private static final long mask = (1L << 48) - 1;
69
70 /**
71 * The random seed. We can't use super.seed.
72 */
73 private long rnd;
74
75 /**
76 * Initialization flag to permit calls to setSeed to succeed only
77 * while executing the Random constructor. We can't allow others
78 * since it would cause setting seed in one part of a program to
79 * unintentionally impact other usages by the thread.
80 */
81 boolean initialized;
82
83 // Padding to help avoid memory contention among seed updates in
84 // different TLRs in the common case that they are located near
85 // each other.
86 private long pad0, pad1, pad2, pad3, pad4, pad5, pad6, pad7;
87
88 /**
89 * The actual ThreadLocal
90 */
91 private static final ThreadLocal<ThreadLocalRandom> localRandom =
92 new ThreadLocal<ThreadLocalRandom>() {
93 protected ThreadLocalRandom initialValue() {
94 return new ThreadLocalRandom();
95 }
96 };
97
98
99 /**
100 * Constructor called only by localRandom.initialValue.
101 */
102 ThreadLocalRandom() {
103 super();
104 initialized = true;
105 }
106
107 /**
108 * Returns the current thread's {@code ThreadLocalRandom}.
109 *
110 * @return the current thread's {@code ThreadLocalRandom}
111 */
112 public static ThreadLocalRandom current() {
113 return localRandom.get();
114 }
115
116 /**
117 * Throws {@code UnsupportedOperationException}. Setting seeds in
118 * this generator is not supported.
119 *
120 * @throws UnsupportedOperationException always
121 */
122 public void setSeed(long seed) {
123 if (initialized)
124 throw new UnsupportedOperationException();
125 rnd = (seed ^ multiplier) & mask;
126 }
127
128 protected int next(int bits) {
129 rnd = (rnd * multiplier + addend) & mask;
130 return (int) (rnd >>> (48-bits));
131 }
132
133 /**
134 * Returns a pseudorandom, uniformly distributed value between the
135 * given least value (inclusive) and bound (exclusive).
136 *
137 * @param least the least value returned
138 * @param bound the upper bound (exclusive)
139 * @throws IllegalArgumentException if least greater than or equal
140 * to bound
141 * @return the next value
142 */
143 public int nextInt(int least, int bound) {
144 if (least >= bound)
145 throw new IllegalArgumentException();
146 return nextInt(bound - least) + least;
147 }
148
149 /**
150 * Returns a pseudorandom, uniformly distributed value
151 * between 0 (inclusive) and the specified value (exclusive).
152 *
153 * @param n the bound on the random number to be returned. Must be
154 * positive.
155 * @return the next value
156 * @throws IllegalArgumentException if n is not positive
157 */
158 public long nextLong(long n) {
159 if (n <= 0)
160 throw new IllegalArgumentException("n must be positive");
161 // Divide n by two until small enough for nextInt. On each
162 // iteration (at most 31 of them but usually much less),
163 // randomly choose both whether to include high bit in result
164 // (offset) and whether to continue with the lower vs upper
165 // half (which makes a difference only if odd).
166 long offset = 0;
167 while (n >= Integer.MAX_VALUE) {
168 int bits = next(2);
169 long half = n >>> 1;
170 long nextn = ((bits & 2) == 0) ? half : n - half;
171 if ((bits & 1) == 0)
172 offset += n - nextn;
173 n = nextn;
174 }
175 return offset + nextInt((int) n);
176 }
177
178 /**
179 * Returns a pseudorandom, uniformly distributed value between the
180 * given least value (inclusive) and bound (exclusive).
181 *
182 * @param least the least value returned
183 * @param bound the upper bound (exclusive)
184 * @return the next value
185 * @throws IllegalArgumentException if least greater than or equal
186 * to bound
187 */
188 public long nextLong(long least, long bound) {
189 if (least >= bound)
190 throw new IllegalArgumentException();
191 return nextLong(bound - least) + least;
192 }
193
194 /**
195 * Returns a pseudorandom, uniformly distributed {@code double} value
196 * between 0 (inclusive) and the specified value (exclusive).
197 *
198 * @param n the bound on the random number to be returned. Must be
199 * positive.
200 * @return the next value
201 * @throws IllegalArgumentException if n is not positive
202 */
203 public double nextDouble(double n) {
204 if (n <= 0)
205 throw new IllegalArgumentException("n must be positive");
206 return nextDouble() * n;
207 }
208
209 /**
210 * Returns a pseudorandom, uniformly distributed value between the
211 * given least value (inclusive) and bound (exclusive).
212 *
213 * @param least the least value returned
214 * @param bound the upper bound (exclusive)
215 * @return the next value
216 * @throws IllegalArgumentException if least greater than or equal
217 * to bound
218 */
219 public double nextDouble(double least, double bound) {
220 if (least >= bound)
221 throw new IllegalArgumentException();
222 return nextDouble() * (bound - least) + least;
223 }
224
225 private static final long serialVersionUID = -5851777807851030925L;
226}