Random中为空(for;)循环的目的是什么?

时间:2015-09-19 01:02:21

标签: java

我正在查看java.util.Random类,发现了这个:

private static long seedUniquifier() {
    // L'Ecuyer, "Tables of Linear Congruential Generators of
    // Different Sizes and Good Lattice Structure", 1999
    for (;;) {
        long current = seedUniquifier.get();
        long next = current * 181783497276652981L;
        if (seedUniquifier.compareAndSet(current, next))
            return next;
    }

那个循环有没有理由存在?

2 个答案:

答案 0 :(得分:1)

字段seedUniquifierAtomicIntegercompareAndSet指令用于通过验证变量的预期内容并在单个操作中更改它来防止线程冲突。

基于Javadoc中的描述:

  

此构造函数将随机数生成器的种子设置为非常可能与此构造函数的任何其他调用不同的值。

看起来uniquifier的目的是帮助确保如果两个线程同时尝试创建new Random(),他们不会最终得到相同的种子值(和因此输出顺序); for循环告诉构造函数,如果它发现了碰撞(compareAndSet为false),那么它应该继续尝试。在正常情况下,它会立即返回。

答案 1 :(得分:0)

for(;;)是一个无限循环,应该包含breakreturn,否则您将获得无法访问的语句编译错误。