做游戏后台的,就避免不了生成随机数,随机物品给玩家,就会存在大量的调用随机方法的可能。我们探讨下哪种写法比较合适。
java.util.Random
java.util.Random 从Java 1.0开始就存在了。它是一个线程安全类,理论上可以通过它同时在多个线程中获得互不相同的随机数。这样的线程安全是通过AtomicLong实现的。
Random 使用 AtomicLong CAS (compare-and-set)操作来更新它的seed,尽管很多非阻塞式算法中使用了非阻塞式原语,CAS在资源高度竞争时的表现依然糟糕。我们写几个对比测试下。
测试代码:
private static class RandomTask implements Runnable
{
private final Random rnd;
protected final int id;
private final long count;
private final CountDownLatch latch;
private RandomTask(Random rnd, int id, long count, CountDownLatch latch) {
this.rnd = rnd;
this.id = id;
this.count = count;
this.latch = latch;
}
protected Random getRandom()
{
return rnd;
}
@Override
public void run() {
try {
final Random r = getRandom();
latch.countDown();
latch.await();
final long start = System.currentTimeMillis();
int sum = 0;
for (long j = 0; j < count; ++j )
{