经历了Java 7的新功能并发现添加了这个新类:
对于并发访问,请使用ThreadLocalRandom代替
Math.random()导致较少的争用并最终更好
性能。
正在重新研究如何实现此目的,从而减少了争用并提高了性能。
最佳答案
实际上,两者之间的区别在于同步。 Math#random()
可能被多个线程同时调用,因此必须同步,而ThreadLocalRandom
是Random
的非同步版本,它是线程绑定的,这意味着每个线程都有自己的(更快)分配。
如果仔细看一下实现,您会发现Math#random()
使用java.util.Random
的单个实例生成随机数,其中ThreadLocalRandom
为每个线程分配一个实例,从而消除了这种意义上的争用。ThreadLocalRandom
实现并发性,而Math#random()
实现同步。