假设你有下面的类
public class AccessStatistics {
private final int noPages, noErrors;
public AccessStatistics(int noPages, int noErrors) {
this.noPages = noPages;
this.noErrors = noErrors;
}
public int getNoPages() { return noPages; }
public int getNoErrors() { return noErrors; }
}然后执行以下代码
private AtomicReference<AccessStatistics> stats =
new AtomicReference<AccessStatistics>(new AccessStatistics(0, 0));
public void incrementPageCount(boolean wasError) {
AccessStatistics prev, newValue;
do {
prev = stats.get();
int noPages = prev.getNoPages() + 1;
int noErrors = prev.getNoErrors;
if (wasError) {
noErrors++;
}
newValue = new AccessStatistics(noPages, noErrors);
} while (!stats.compareAndSet(prev, newValue));
}在最后两行中
newValue = new AccessStatistics(noPages, noErrors);
while (!stats.compareAndSet(prev, newValue)) 这是否意味着新创建的AccessStatistics实例与当前AccessStatistics实例具有相同的引用。怎么会这样呢?有人能解释一下吗。非常感谢。
发布于 2012-07-15 23:56:50
如果stats持有的当前引用不是prev,则stats.compareAndSet(prev, newValue)将失败并返回false。
通常,在多线程环境中,在prev = stats.get();和stats.compareAndSet(prev, newValue);之间,另一个线程很可能已经修改了stats持有的引用。
stats.compareAndSet(prev, newValue);真的说:
stats仍然持有对prev的引用,就像之前的5行一样,更新它以持有对newValuestats持有的引用,放弃我的计算并循环以重新计算新的发布于 2012-07-15 23:57:26
新创建的对象是新的。在创建它的那一行之后,唯一引用它的是newValue。别的什么都不能--怎么可能?除了你所知道的关于prev的旧的和你创建的newValue的新的值之外,只有在没有其他设置的情况下,compareAndSet()才会设置成第三个值。
https://stackoverflow.com/questions/11493309
复制相似问题