场景
Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化:
Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数
参考以上性能测试工具的使用。
Java开发手册中有这样一条:
【推荐】避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed导致的性能下降。
说明:Random 实例包括 java.util.Random 的实例或者 Math.random()的方式。
正例:在 JDK7 之后,可以直接使用 API ThreadLocalRandom,而在 JDK7 之前,
需要编码保证每个线程持有一个单独的 Random 实例。
Math.random() 底层确实是使用 Random 类来实现的。
Math.random()在底层调用了java.util.Random类的nextDouble()方法。
Random类的核心在于其内部维护了一个种子(seed),这个种子是随机数生成算法的起点。
相同的种子会生成相同的随机数序列。在创建Random对象时,如果不提供种子,则默认使用
系统时间作为种子,因此每次创建新的Random对象时,由于系统时间的不同,生成的随机数序列
也会不同。
而Random 在多线程下会因为竞争种⼦(seed)而导致性能下降,而ThreadLocalRandom 则不会出现这种情况,
因此在多线程环境下 ThreadLocalRandom 的性能会比Random 好很多。
注:
实现
接下来我们来测试⼀下 ThreadLocalRandom 和 Random 性能差异,测试代码如下:
测试结果:
从上述结果可以看出ThreadLocalRandom的性能⽐Random的性能⼤约⾼ 3.5倍,
因此在多线程情况下要尽量使⽤ ThreadLocalRandom。