< prev index next >

src/java.base/share/classes/java/util/concurrent/ThreadLocalRandom.java

Print this page
rev 17358 : 8182487: Add Unsafe.objectFieldOffset(Class, String)
Reviewed-by: dsimms


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
< prev index next >