无需多言,直接告诉你ThreadLocalRandom是获取随机数之王
2023-11-03 04:27:33
背景
最近在写一些业务代码时遇到一个需要产生随机数的场景,这时自然想到jdk包里的Random类。但出于对性能的极致追求,就考虑使用ThreadLocalRandom类进行优化,在查看官方文档时又发现了NativeRandom类。于是就产生了这篇文章,分析这三个类来分别介绍其优势。
Random
Random类是Java中最常用的随机数生成器,它使用伪随机数算法来生成随机数,种子是随机数生成器的状态,用于初始化伪随机数生成器,相同的种子会产生相同的随机数序列。Random类实现了java.util.Random抽象类,该抽象类提供了生成随机数的方法,Random类有以下优点:
- 易于使用:Random类的接口非常简单,只需创建一个Random类的实例,然后就可以调用nextInt()、nextDouble()等方法来生成随机数。
- 可移植性强:Random类可以在不同的平台上使用,并且能够产生一致的随机数序列。
- 线程安全性:Random类不是线程安全的,这意味着如果多个线程同时调用Random类的生成随机数方法,则可能会产生错误的结果。
ThreadLocalRandom
ThreadLocalRandom类是Java 7中引入的新类,它也是一个随机数生成器,但它与Random类不同,它是一个线程安全的随机数生成器,这意味着即使多个线程同时调用ThreadLocalRandom类的生成随机数方法,也不会产生错误的结果。ThreadLocalRandom类有以下优点:
- 线程安全:ThreadLocalRandom类是线程安全的,因此可以安全地用于多线程环境中。
- 性能优于Random类:ThreadLocalRandom类使用了一种名为“分裂混合器”的算法来生成随机数,该算法比Random类使用的算法要快得多。
- 可移植性强:ThreadLocalRandom类可以在不同的平台上使用,并且能够产生一致的随机数序列。
NativeRandom
NativeRandom类是Java 9中引入的新类,它也是一个随机数生成器,但它与Random类和ThreadLocalRandom类不同,它是通过调用底层操作系统提供的随机数生成器来生成随机数的。NativeRandom类有以下优点:
- 性能优于Random类和ThreadLocalRandom类:NativeRandom类通过调用底层操作系统提供的随机数生成器来生成随机数,因此它的性能优于Random类和ThreadLocalRandom类。
- 可移植性强:NativeRandom类可以在不同的平台上使用,并且能够产生一致的随机数序列。
结论
Random类、ThreadLocalRandom类和NativeRandom类都是Java中常用的随机数生成器,它们各有优缺点。Random类易于使用、可移植性强,但不是线程安全的。ThreadLocalRandom类是线程安全的,性能优于Random类,但可移植性不如Random类。NativeRandom类性能优于Random类和ThreadLocalRandom类,可移植性强,但使用起来比Random类和ThreadLocalRandom类要复杂一些。在选择随机数生成器时,应根据具体情况选择最合适的类。