JUC包中的分而治之策略-为提高性能而生( 八 )

  • 然后根据新的种子和bound变量通过一定的算法来计算新的随机数 。

  • 下面看下next()代码:

    • 代码(6)使用原子变量的get方法获取当前原子变量种子的值

    • 代码(7)根据具体的算法使用当前种子值计算新的种子

    • 代码(8)使用CAS操作 , 使用新的种子去更新老的种子 , 多线程下可能多个线程都同时执行到了代码(6)那么可能多个线程都拿到的当前种子的值是同一个 , 然后执行步骤(7)计算的新种子也都是一样的 , 但是步骤(8)的CAS操作会保证只有一个线程可以更新老的种子为新的 , 失败的线程会通过循环从新获取更新后的种子作为当前种子去计算老的种子这就保证了随机数的随机性 。

    • 代码(9)则使用固定算法根据新的种子计算随机数 , 并返回 。

    3.2 ThreadLocalRandom

    Random类生成随机数原理以及不足:每个Random实例里面有一个原子性的种子变量用来记录当前的种子的值 , 当要生成新的随机数时候要根据当前种子计算新的种子并更新回原子变量 。

    推荐阅读