经历了Java 7的新功能并发现添加了这个新类:


  对于并发访问,请使用ThreadLocalRandom代替
  Math.random()导致较少的争用并最终更好
  性能。


正在重新研究如何实现此目的,从而减少了争用并提高了性能。

最佳答案

实际上,两者之间的区别在于同步。 Math#random()可能被多个线程同时调用,因此必须同步,而ThreadLocalRandomRandom的非同步版本,它是线程绑定的,这意味着每个线程都有自己的(更快)分配。

如果仔细看一下实现,您会发现Math#random()使用java.util.Random的单个实例生成随机数,其中ThreadLocalRandom为每个线程分配一个实例,从而消除了这种意义上的争用。

ThreadLocalRandom实现并发性,而Math#random()实现同步。

09-11 17:29