首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicReference.compareAndSet()用于确定什么?

AtomicReference.compareAndSet()用于确定什么?
EN

Stack Overflow用户
提问于 2009-12-08 21:26:56
回答 4查看 5.7K关注 0票数 6

假设你有以下课程

代码语言:javascript
复制
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; }
}

然后执行以下代码

代码语言:javascript
复制
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));
}

在最后一行while (!stats.compareAndSet(prev, newValue))中,compareAndSet方法如何确定prevnewValue之间的相等?实现AccessStatistics方法是否需要equals()类?如果没有,为什么?javadoc为AtomicReference.compareAndSet声明了以下内容

如果当前值==为期望值,则

原子地将值设置为给定的更新值。

..。但这一断言似乎非常普遍,我在AtomicReference上读过的教程从来没有建议为包装在AtomicReference中的类实现相等()。

如果包装在AtomicReference中的类需要实现相等(),那么对于比AccessStatistics更复杂的对象,我想同步更新对象而不使用AtomicReference的方法可能更快。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-08 21:33:01

它像使用了==运算符一样比较了refrerences。这意味着引用必须指向同一个实例。不使用Object.equals()。

票数 6
EN

Stack Overflow用户

发布于 2011-12-12 14:03:42

实际上,它没有比较prev和newValue!

相反,它将存储在stats中的值与prev进行比较,并且只有在它们相同的情况下,它才会将存储在stats中的值更新为newValue。如前所述,它使用相等运算符(==)来完成此操作。这意味着,当prev指向存储在stats中的相同对象时,将更新stats。

票数 2
EN

Stack Overflow用户

发布于 2009-12-08 21:31:57

它只检查对象引用相等(又名==),因此如果AtomicReference持有的对象引用在获得引用后发生了更改,则不会更改引用,因此必须重新开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1869959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档