1040 private static final long SEEDER_INCREMENT = 0xbb67ae8584caa73bL;
1041
1042 // Constants from SplittableRandom
1043 private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53)
1044 private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24)
1045
1046 // IllegalArgumentException messages
1047 static final String BAD_BOUND = "bound must be positive";
1048 static final String BAD_RANGE = "bound must be greater than origin";
1049 static final String BAD_SIZE = "size must be non-negative";
1050
1051 // Unsafe mechanics
1052 private static final Unsafe U = Unsafe.getUnsafe();
1053 private static final long SEED;
1054 private static final long PROBE;
1055 private static final long SECONDARY;
1056 private static final long THREADLOCALS;
1057 private static final long INHERITABLETHREADLOCALS;
1058 private static final long INHERITEDACCESSCONTROLCONTEXT;
1059 static {
1060 try {
1061 SEED = U.objectFieldOffset
1062 (Thread.class.getDeclaredField("threadLocalRandomSeed"));
1063 PROBE = U.objectFieldOffset
1064 (Thread.class.getDeclaredField("threadLocalRandomProbe"));
1065 SECONDARY = U.objectFieldOffset
1066 (Thread.class.getDeclaredField("threadLocalRandomSecondarySeed"));
1067 THREADLOCALS = U.objectFieldOffset
1068 (Thread.class.getDeclaredField("threadLocals"));
1069 INHERITABLETHREADLOCALS = U.objectFieldOffset
1070 (Thread.class.getDeclaredField("inheritableThreadLocals"));
1071 INHERITEDACCESSCONTROLCONTEXT = U.objectFieldOffset
1072 (Thread.class.getDeclaredField("inheritedAccessControlContext"));
1073 } catch (ReflectiveOperationException e) {
1074 throw new Error(e);
1075 }
1076 }
1077
1078 /** Rarely-used holder for the second of a pair of Gaussians */
1079 private static final ThreadLocal<Double> nextLocalGaussian =
1080 new ThreadLocal<>();
1081
1082 /** Generates per-thread initialization/probe field */
1083 private static final AtomicInteger probeGenerator = new AtomicInteger();
1084
1085 /** The common ThreadLocalRandom */
1086 static final ThreadLocalRandom instance = new ThreadLocalRandom();
1087
1088 /**
1089 * The next seed for default constructors.
1090 */
1091 private static final AtomicLong seeder
1092 = new AtomicLong(mix64(System.currentTimeMillis()) ^
1093 mix64(System.nanoTime()));
1094
1095 // at end of <clinit> to survive static initialization circularity
|
1040 private static final long SEEDER_INCREMENT = 0xbb67ae8584caa73bL;
1041
1042 // Constants from SplittableRandom
1043 private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53)
1044 private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24)
1045
1046 // IllegalArgumentException messages
1047 static final String BAD_BOUND = "bound must be positive";
1048 static final String BAD_RANGE = "bound must be greater than origin";
1049 static final String BAD_SIZE = "size must be non-negative";
1050
1051 // Unsafe mechanics
1052 private static final Unsafe U = Unsafe.getUnsafe();
1053 private static final long SEED;
1054 private static final long PROBE;
1055 private static final long SECONDARY;
1056 private static final long THREADLOCALS;
1057 private static final long INHERITABLETHREADLOCALS;
1058 private static final long INHERITEDACCESSCONTROLCONTEXT;
1059 static {
1060 SEED = U.objectFieldOffset
1061 (Thread.class, "threadLocalRandomSeed");
1062 PROBE = U.objectFieldOffset
1063 (Thread.class, "threadLocalRandomProbe");
1064 SECONDARY = U.objectFieldOffset
1065 (Thread.class, "threadLocalRandomSecondarySeed");
1066 THREADLOCALS = U.objectFieldOffset
1067 (Thread.class, "threadLocals");
1068 INHERITABLETHREADLOCALS = U.objectFieldOffset
1069 (Thread.class, "inheritableThreadLocals");
1070 INHERITEDACCESSCONTROLCONTEXT = U.objectFieldOffset
1071 (Thread.class, "inheritedAccessControlContext");
1072 }
1073
1074 /** Rarely-used holder for the second of a pair of Gaussians */
1075 private static final ThreadLocal<Double> nextLocalGaussian =
1076 new ThreadLocal<>();
1077
1078 /** Generates per-thread initialization/probe field */
1079 private static final AtomicInteger probeGenerator = new AtomicInteger();
1080
1081 /** The common ThreadLocalRandom */
1082 static final ThreadLocalRandom instance = new ThreadLocalRandom();
1083
1084 /**
1085 * The next seed for default constructors.
1086 */
1087 private static final AtomicLong seeder
1088 = new AtomicLong(mix64(System.currentTimeMillis()) ^
1089 mix64(System.nanoTime()));
1090
1091 // at end of <clinit> to survive static initialization circularity
|