繁体   English   中英

原子参考

[英]AtomicReference

根据文档,我对AtomicReference.compareAndSet()方法有一些疑问,它说:

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

据我了解, ==运算符正在比较两个对象的地址,如果可以的话,它将如何在这样的示例中工作

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));
}

在此代码段中,jvm如何知道将在compareAndSet()比较AccessStatistics哪些字段? 实际上,我只是想知道,如果java根本不允许覆盖== ,那么整个策略如何工作? 感谢您的任何评论!

jvm如何知道在compareAndSet()中要比较AccessStatistics的哪些字段?

没有。 它不比较对象中的字段。 它只是比较文档中所说的对象的引用 这就是AtomicReference类的工作方式。 正如您从javadocs所提到的,它使用==而不是equals()方法。

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

所有的Atomic*类都具有相似的功能。 它允许您原子设置值,同时确保另一个线程不会覆盖您的值。 使用compareAndSet(...) ,必须指定当前对象引用,以确保按预期进行更新。

在您的代码段中,它试图添加到不可变的访问统计对象。 因此,它将获取当前值,将其添加到该值,然后将新的统计信息存储到引用中。 如果另一个线程在该时间之间存储了统计信息,则compareAndSet将返回false并循环循环compareAndSet 这样就解决了竞赛条件,而不必具有synchronized块。

JVM根本不比较这些字段。 只是比较它是相同的引用,内存中的指针还是您要调用的任何对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM