当前位置: 首页 > 面试题库 >

何时使用AtomicReference(Java)?真的有必要吗?

暴夕
2023-03-14
问题内容

我已经使用AtomicLong很多次了,但从未使用过AtomicReference

似乎AtomicReference确实做到了(我从另一个stackoverflow问题复制了此代码):

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}

要么

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue || this.someList.equals(oldValue)) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}

假设this.someList被标记为volatile。

我不确定是哪一个,因为如果使用.equals,则该类的javadoc和代码不清楚。

看到上面的方法写起来不那么难吗,有人使用过AtomicReference吗?


问题答案:

这是 参考
,因此可以进行比较。该文档非常清楚地表明这是一个身份比较,即使使用描述中的==操作也是如此。

AtomicReference经常使用和其他原子类。分析表明,与使用同步的等效方法相比,它们的性能更好。例如,对的get()操作AtomicReference仅需要从主内存中提取,而使用的类似操作synchronized必须首先将线程缓存的所有值刷新到主内存,然后执行其提取。

这些AtomicXXX类提供对比较和交换(CAS)操作的本机支持的访问。如果基础系统支持它,那么CAS将比使用synchronized纯Java块构建的任何方案都要快。



 类似资料:
  • 问题内容: 我应该在样式表中使用以下哪项? W3C指定什么是 正确的方法 ? 问题答案: W3C表示引号是可选的,您使用的所有三种方式都是合法的。 开头和结尾的引号只需是相同的字符。 如果您的URL中包含特殊字符,则应使用引号或转义字符(请参见下文)。 URI值的格式为’url(’,后跟可选的空格,后跟可选的单引号(’)或双引号(“)字符,然后是URI本身,然后是可选的单引号(’)或双引号(“)字

  • 我引用的是另一篇讨论在JWT中使用刷新令牌的SO帖子。 JWT(JSON Web令牌)自动延长到期时间 我有一个应用程序,它具有一个非常通用的体系结构,在这个体系结构中,我的客户机(web和移动)与一个REST API对话,然后再与一个服务层和数据层对话。 令牌每小时由客户端刷新一次。 如果用户令牌未被刷新(用户处于非活动状态且应用程序未打开)并且过期,则无论何时他们想要恢复,都需要登录。 我看到

  • 我正在尝试用我的项目设置mapstruct,我已经习惯了通过简单的jvm代理来完成的lombok,所以我真的不明白如何让mapstruct工作。 这是我的pom: 请注意,在mapstruct进入游戏之前,我不需要整个maven编译插件块:一切都很好。我可以毫无问题地构建springboot胖jar,无需明确指定spring和lombok注释处理。。。那是非常美好的时光。 现在我甚至不确定我是否在

  • java.util.concurrent.atomic.AtomicReference类提供对底层对象引用的操作,可以原子方式读取和写入,还包含高级原子操作。 AtomicReference支持对底层对象引用变量的原子操作。 它具有get和set方法,类似于对volatile变量的读写操作。 也就是说,集合与同一变量上的任何后续获取具有先发生关系。 原子compareAndSet方法也具有这些内存

  • 当然,我们可以这样做: 但是要比长得多。 我知道这与流需要围绕Java的非对象原语进行修改的方式有关,但是,我在这里是否遗漏了什么?有没有什么方法可以把自动装箱压缩到更短的地方?还是这只是目前的技术水平?

  • 问题内容: 我已经创建了一些响应式站点,但对于响应式站点开发还是相当陌生的。在我的CSS中,我有99%的值以em或百分比表示。我正在使用媒体查询(最大宽度和最大设备宽度)进行布局更改。我还没有包含viewport meta标签,它在iOS,我测试过的许多Android手机和平板电脑以及所有桌面浏览器上都可以完美运行。 添加元标记会破坏我的网站。我是在做错什么,还是在做正确的事情,以至于不需要包含它