我正在查看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;
}
那个循环有没有理由存在?
答案 0 :(得分:1)
字段seedUniquifier
是AtomicInteger
,compareAndSet
指令用于通过验证变量的预期内容并在单个操作中更改它来防止线程冲突。
基于Javadoc中的描述:
此构造函数将随机数生成器的种子设置为非常可能与此构造函数的任何其他调用不同的值。
看起来uniquifier的目的是帮助确保如果两个线程同时尝试创建new Random()
,他们不会最终得到相同的种子值(和因此输出顺序); for
循环告诉构造函数,如果它发现了碰撞(compareAndSet
为false),那么它应该继续尝试。在正常情况下,它会立即返回。
答案 1 :(得分:0)
for(;;)
是一个无限循环,应该包含break
或return
,否则您将获得无法访问的语句编译错误。