900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Java SE 随机数生成器 Random

Java SE 随机数生成器 Random

时间:2020-03-24 19:15:48

相关推荐

Java SE 随机数生成器 Random

目录

Random 性能问题

ThreadLocalRandom

SecureRandom

Random 性能问题

1、使用 Random 类时,为了避免重复创建的开销,通常将实例化好的 Random 对象设置为服务对象的属性或静态属性,这在线程竞争不激烈的情况下没有问题,但高并发时,使用同一个 Random 对象可能会导致线程阻塞。

2、Random 的随机原理是对一个'随机种子'进行固定的算术和位运算,得到随机结果,再使用这个结果作为下一次随机的种子。在解决线程安全问题时,Random 使用 CAS 更新下一次随机的种子,可以想到,如果多个线程同时使用这个对象,就肯定会有一些线程执行 CAS 连续失败,进而导致线程阻塞。

ThreadLocalRandom

1、Java jdk 1.7 开始在 concurrent 包内添加了 ThreadLocalRandom 类,与当前线程隔离的随机数生成器。

2、ThreadLocalRandom 通常应该是这样的形式: ThreadLocalRandom.current().nextX(...) (其中X是Int , Long ,等),当所有用法都是这种形式时,绝对不可能跨多个线程共享一个ThreadLocalRandom。

3、ThreadLocalRandom 还提供了其他常用的有界随机生成方法,ThreadLocalRandom 不是加密安全的,在安全敏感的应用程序中考虑使用 SecureRandom。

SecureRandom

1、SecureRandom 提供了一个密码强的随机数生成器,调用者通过无参数构造函数或 getInstance 方法之一获取一个 SecureRandom 实例。

/*** 实际项目中不推荐使用 Random、建议使用 ThreadLocalRandom、SecureRandom* int nextInt():返回此随机数生成器序列中的下一个伪随机,包括负数,如 -8022357372481675815* long nextLong():返回此随机数生成器序列中的下一个伪随机,包括负数,如 -686133030* int nextInt(int bound):返回 [0,bound) 之间的随机数* boolean nextBoolean():随机返回 true 或者 false.* double nextDouble(): 返回 (0,1) 之间的随机浮点型,如 0.22474496933706056* float nextFloat():返回 (0,1) 之间的随机浮点型,如 0.9701549*/@Testpublic void testRandom() {System.out.println(new Random().nextInt());System.out.println(new Random().nextInt(1000));System.out.println(new Random().nextBoolean());System.out.println(new Random().nextDouble());System.out.println(new Random().nextFloat());System.out.println(new Random().nextLong());}/*** Java jdk 1.7 开始在 concurrent 包内添加了 ThreadLocalRandom 类,与当前线程隔离的随机数生成器。* ThreadLocalRandom 不是加密安全的,在安全敏感的应用程序中考虑使用 SecureRandom。*/@Testpublic void testSecureRandom2() {System.out.println(ThreadLocalRandom.current().nextInt());System.out.println(ThreadLocalRandom.current().nextInt(1000));System.out.println(ThreadLocalRandom.current().nextBoolean());System.out.println(ThreadLocalRandom.current().nextDouble());System.out.println(ThreadLocalRandom.current().nextFloat());System.out.println(ThreadLocalRandom.current().nextLong());}/*** SecureRandom 提供了一个密码强的随机数生成器,调用者通过无参数构造函数或 getInstance 方法之一获取一个 SecureRandom 实例。*/@Testpublic void testSecureRandom() {System.out.println(new SecureRandom().nextInt());System.out.println(new SecureRandom().nextInt(1000));System.out.println(new SecureRandom().nextBoolean());System.out.println(new SecureRandom().nextDouble());System.out.println(new SecureRandom().nextFloat());System.out.println(new SecureRandom().nextLong());}

src/main/java/org/example/uitls/RandomTest.java · 汪少棠/java-se -

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。