假设您有以下类(class)
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));
}
在最后一行
while (!stats.compareAndSet(prev, newValue))
中,compareAndSet
方法如何确定prev
和newValue
之间的相等性?实现AccessStatistics
方法是否需要equals()
类?如果没有,为什么? Javadoc声明了AtomicReference.compareAndSet
的以下内容...但是这个断言似乎很笼统,我在AtomicReference上阅读的教程从不建议对包裹在AtomicReference中的类实现equals()。
如果需要用包裹在AtomicReference中的类来实现equals(),那么对于比
AccessStatistics
更复杂的对象,我想同步更新对象而不使用AtomicReference的方法可能会更快。 最佳答案
就像您使用==运算符一样,它完全比较这些引用值。这意味着引用必须指向相同的实例。不使用Object.equals()。