为什么Random中的下一个方法使用compareAndSet?

时间:2015-10-26 15:51:10

标签: java random atomic

在阅读Java中的java.util.Random类的文档时,我偶然发现了next方法中的一些我无法理解的方法。

protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}

我注意到!seed.compareAndSet(oldseed, nextseed)的使用,我正在努力了解它的用途。解释是什么?

1 个答案:

答案 0 :(得分:3)

来自JavaDoc for compareAndSet

  

如果当前值==预期值,则以原子方式将值设置为给定的更新值。

这样做是为了确保在seed.get()和集合之间(在comapreAndSet内),没有其他线程调用另一个set()(例如通过并行调用next()) 。因为旧种子用于计算下一粒种子。如果在另一个Thread之间调用seed.set()方法,则不会使用最新值计算“下一个”种子。最后一个值之前的值将被使用,并且算法会在多线程环境中产生副作用。

此算法用于线程保存。因为如果旧值不是预期值,则循环将重复,直到两个值匹配。