在阅读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)的使用,并且我试图了解它的用途。有什么解释?

最佳答案

JavaDoc for compareAndSet:

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

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

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

07-24 09:49
查看更多