Ado*_*ath 5 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));
}
Run Code Online (Sandbox Code Playgroud)
我注意到了 的使用!seed.compareAndSet(oldseed, nextseed),我试图了解它的用途。解释是什么?
如果当前值 == 预期值,则原子地将值设置为给定的更新值。
这样做是为了确保seed.get()在 set 和 set之间(在 comapreAndSet 内),没有其他线程调用了另一个线程set()(例如,通过并行调用next())。因为旧种子是用来计算下一个种子的。如果在其他线程之间调用该seed.set()方法,则不会使用最新值计算“下一个”种子。将使用最后一个值之前的值,并且该算法在多线程环境中会产生副作用。
该算法用于线程保存。因为如果旧值不是预期的值,循环将重复直到两个值匹配。
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |