Java中提供了好几个类,可以让我们方便的实现随机数等功能,
这些类有java.util.Random, java.util.UUID **
以及JDK 7 新引入的java.util.concurrent.ThreadLocalRandom**等。
Random虽然是线程安全的,但是在多线程下效率比较低,而且Random产生的随机数可能被预测,顾不适合做验证码类的随机数生产。
在JDK7中,java.util.concurrent包含了一个相当便利的类,ThreadLocalRandom,当应用程序期望在多个线程或ForkJoinTasks中使用随机数时。
对于并发访问,使用TheadLocalRandom代替Math.random()可以减少竞争,从而获得更好的性能。
你只需调用ThreadLocalRandom.current(), 然后调用它的其中一个方法去获取一个随机数即可。
一个例子:
<pre>
int r = ThreadLocalRandom.current().nextInt(4,77);
</pre>
为什么使用ThreadLocalRandom在并发情况下,性能更好?
- 因为Random用了很多CAS的类,ThreadLocalRandom根本没有用到。
展开阅读