返回

随机数大变革!ThreadLocalRandom究竟性能如何?

后端

ThreadLocalRandom:优于 Random 的高效随机数生成器

在软件开发中,生成随机数是常见的需求。传统上,我们使用 Random 类来实现这一需求,该类内部使用 CAS(比较并交换)算法来实现。然而,随着 JDK 1.7 的推出,ThreadLocalRandom 类横空出世,声称其性能更胜一筹。

性能比较

为了验证 ThreadLocalRandom 的性能优势,我们进行了以下实验:

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class RandomTest {

    private static final int COUNT = 10000000;

    public static void main(String[] args) {
        // Random
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < COUNT; i++) {
            Random random = new Random();
            random.nextInt();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Random耗时:" + (endTime - startTime) + "ms");

        // ThreadLocalRandom
        startTime = System.currentTimeMillis();
        for (int i = 0; i < COUNT; i++) {
            ThreadLocalRandom random = ThreadLocalRandom.current();
            random.nextInt();
        }
        endTime = System.currentTimeMillis();
        System.out.println("ThreadLocalRandom耗时:" + (endTime - startTime) + "ms");
    }
}

实验结果令人印象深刻:ThreadLocalRandom 的耗时仅为 Random 的一半左右。这背后的原因是 ThreadLocalRandom 采用了不同的随机数生成算法,可以避免竞争和锁,从而提高性能。

结论

通过实验对比,我们发现 ThreadLocalRandom 在性能方面确实比 Random 更有优势。因此,在需要生成大量随机数的场景中,建议使用 ThreadLocalRandom 来实现。

常见问题解答

  1. ThreadLocalRandom 和 Random 有什么区别?

    • ThreadLocalRandom 采用了不同的随机数生成算法,可以避免竞争和锁,从而提高性能。
  2. ThreadLocalRandom 的性能提升幅度有多大?

    • 在我们的实验中,ThreadLocalRandom 的耗时约为 Random 的一半。
  3. 在哪些场景中应该使用 ThreadLocalRandom?

    • 需要生成大量随机数的场景。
  4. Random 是否已过时?

    • 虽然 ThreadLocalRandom 性能更好,但 Random 仍然可以在某些情况下使用,例如生成少量的随机数。
  5. ThreadLocalRandom 是线程安全的吗?

    • 是的,ThreadLocalRandom 是线程安全的。