java不同版本在多线程中使用随机数生成器的实现

 更新时间:2023年04月10日 10:12:28   作者:洪宏鸿  
本文主要介绍了java不同版本在多线程中使用随机数生成器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

如何在多线程中使用随机数生成器(Random)

避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一
seed 导致的性能下降。
说明:Random 实例包括 java.util.Random 的实例或者 Math.random()的方式。
正例:在 JDK7 之后,可以直接使用 API ThreadLocalRandom,而在 JDK7 之前,需要编码保证每个线程持有一个实例

具体来说:

  • 避免多线程共享 Random 实例:虽然在多个线程之间共享 Random 实例是线程安全的,但会因为多个线程竞争同一个种子(seed)而导致性能下降。因此,应该尽量避免多个线程共享同一个 Random 实例。
  • 推荐使用 ThreadLocalRandom:在 JDK7 之后,推荐使用 ThreadLocalRandom 作为生成随机数的方式。ThreadLocalRandom 是 Java 中的一个线程安全的随机数生成器,它使用了不同的种子(seed)来生成随机数,避免了多个线程竞争同一个种子导致性能下降的问题。
  • 在 JDK7 之前,需要保证每个线程持有一个 Random 实例:如果使用的是 JDK7 之前的版本,不能使用 ThreadLocalRandom,而是需要保证每个线程持有一个 Random 实例。这可以通过在每个线程中创建一个新的 Random 实例来实现。

综上所述,对于多线程中的随机数生成器,应该尽量避免多个线程共享同一个 Random 实例,而是使用 ThreadLocalRandom(JDK7之后)或者保证每个线程持有一个 Random 实例(JDK7之前)。这样可以避免因为多个线程竞争同一个种子而导致性能下降的问题。

Random 是通过 seed 进行同步的吗?

JDK7 之前的 Random 在生成随机数时是通过 seed 进行同步的。具体来说,Random 内部有一个种子(seed)属性,用于控制随机数的生成。在生成随机数时,Random 使用线性同余法(LCG)根据种子计算出下一个种子,然后用这个新的种子生成随机数。由于线性同余法的计算是基于种子进行的,因此不同的种子会生成不同的随机数序列。

在多线程环境下,如果多个线程同时访问同一个 Random 实例,可能会导致多个线程竞争同一个种子,从而出现性能下降的问题。为了避免这个问题,JDK7 之前的做法是通过 synchronized 关键字对 Random 的实例方法进行同步,从而保证同一时刻只有一个线程可以访问 Random 实例。但是这种做法会带来一定的性能损失,因为在多线程环境下,多个线程可能会因为竞争锁而出现线程阻塞的情况。

因此,在 JDK7 之后,Java 推出了 ThreadLocalRandom,使用不同的种子来生成随机数,避免了多个线程竞争同一个种子导致性能下降的问题。

ThreadLocalRandom 生成随机数的示例

import java.util.concurrent.ThreadLocalRandom;

public class RandomDemo {
    public static void main(String[] args) {
        // 生成一个10到20之间的随机整数
        int randomInt = ThreadLocalRandom.current().nextInt(10, 20);
        System.out.println(randomInt);

        // 生成一个0到1之间的随机浮点数
        double randomDouble = ThreadLocalRandom.current().nextDouble();
        System.out.println(randomDouble);

        // 生成一个100到200之间的随机长整数
        long randomLong = ThreadLocalRandom.current().nextLong(100, 200);
        System.out.println(randomLong);
    }
}

在上面的示例中,我们通过 ThreadLocalRandom.current() 获取了当前线程的 ThreadLocalRandom 实例,然后调用 nextInt、nextDouble 和 nextLong 等方法来生成随机数。由于 ThreadLocalRandom 在不同线程中使用不同的种子来生成随机数,因此可以在多线程环境下使用。

到此这篇关于java不同版本在多线程中使用随机数生成器的实现的文章就介绍到这了,更多相关java 随机数生成器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Eclipse 项目出现错误(红色叹号)解决方法

    Eclipse 项目出现错误(红色叹号)解决方法

    这篇文章主要介绍了Eclipse 项目出现错误(红色叹号)解决方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • 详解Java网络编程

    详解Java网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-06-06
  • Springboot中如何使用Redisson实现分布式锁浅析

    Springboot中如何使用Redisson实现分布式锁浅析

    redisson是redis的java客户端程序,国内外很多公司都有在用,下面这篇文章主要给大家介绍了关于Springboot中如何使用Redisson实现分布式锁的相关资料,需要的朋友可以参考下
    2021-10-10
  • spring接口通过配置支持返回多种格式(xml,json,html,excel)

    spring接口通过配置支持返回多种格式(xml,json,html,excel)

    这篇文章主要给大家介绍了关于spring接口如何通过配置支持返回多种格式(xml,json,html,excel)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-12-12
  • 基于Spring5实现登录注册功能

    基于Spring5实现登录注册功能

    这篇文章主要为大家详细介绍了基于Spring5实现登录注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java中List集合按指定条件排序

    Java中List集合按指定条件排序

    这篇文章主要介绍了Java中List集合按指定条件排序,List是一种有序集合,可以随时添加和删除其中元素,本篇文章针对List集合按照条件排序的几种方式做了实例演示,需要的朋友可以参考下
    2023-07-07
  • java8新特性-lambda表达式入门学习心得

    java8新特性-lambda表达式入门学习心得

    这篇文章主要介绍了java8新特性-lambda表达式入门学习心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    这篇文章主要介绍了Java中实现深拷贝的两种方式—clone() & Serialized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • java 下执行mysql 批量插入的几种方法及用时

    java 下执行mysql 批量插入的几种方法及用时

    java 下执行mysql 批量插入的几种方法及用时,1000次插入方法的比较。
    2013-04-04
  • JAVA中对List进行查询

    JAVA中对List进行查询

    下面小编就为大家带来一篇在java List中进行模糊查询的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08

最新评论