在编写多线程应用程序时,我遇到一个问题,多线程版本的运行时间与单线程版本的运行时间一样长。我意识到我使用线程之间共享的 java.util.Random 。所以我改成ThreadLocalRandom。 我有一个问题,为什么random的设计需要线程同步? SecureRandom 有同样的问题。
这是 Java 文档
中所述的线程争用问题换句话说,由于您正在向多个线程共享 Random 实例,因此每当其中一个线程尝试获取下一个 Random 数时,它就必须“锁定”该实例以执行工作并获取下一个数字。与此同时,另一个线程尝试生成具有相同实例的数字,它必须等待第一个线程完成其工作并释放“锁”,然后才能开始生成下一个数字。
Random 的每个实例一次只能生成一个数字。
使用 ThreadLocalRandom 可以消除这个问题,因为每个线程都使用它自己的 Random 实例。