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

AtomicInteger和volatile [重复]

薄哲
2023-03-14
问题内容

这个问题已经在这里有了答案

atomic / volatile / synchronized有什么区别? (7个答案)

11个月前关闭。

我知道volatile允许可见性,AtomicInteger允许原子性。因此,如果我使用volatile
AtomicInteger,是否意味着我不必再使用任何同步机制了?

例如。

class A {

    private volatile AtomicInteger count;

    void someMethod(){
        // do something
        if(count.get() < 10) {
            count.incrementAndGet();
        }
}

这是线程安全的吗?


问题答案:

我相信这Atomic*实际上会 同时带来 原子性和波动性。因此,当您致电(say)时AtomicInteger.get(),可以保证获得
最新的 价值。java.util.concurrent.atomic
包文档中对此进行了记录:

如Java™语言规范的第17.4节所述,用于访问和更新原子的记忆效应通常遵循关于挥发物的规则。

  • get具有读取易失性变量的存储效果。
  • set具有写入(分配)volatile变量的存储效果。
    * lazySet具有写入(分配)易失性变量的内存效果,除了它允许对后续(但不是先前)的内存操作进行重排序,而这些内存操作本身不会对普通的非易失性写入施加强加约束。在其他用法上下文中,出于垃圾回收的考虑,在清空时可能会应用>-lazySet,该引用将不再被访问。
    * weakCompareAndSet原子地读取并有条件地写入变量,但不会在排序之前创建任何事件,因此,对于除nonCompCompAndAndSet目标之外的任何变量的先前或后续读取和写入,不提供任何保证。
  • compareAndSet和所有其他读取和更新操作(例如getAndIncrement)具有读取和写入易失性变量的内存影响。

现在如果你有

volatile AtomicInteger count;

volatile部分意味着每个线程将使用最新AtomicInteger引用,并且这AtomicInteger意味着您 还将
看到该对象的最新值。

不需要它是不常见的(IME)-因为通常您不会重新分配count以引用另一个对象。相反,您将拥有:

private final AtomicInteger count = new AtomicInteger();

那时,它是一个final变量这一事实意味着所有线程都将处理同一个对象-并且它是一个Atomic*对象这一事实意味着它们将在该对象中看到最新的值。



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

  • 主要内容:1 原子类AtomicInteger,1.1 重要属性,1.2 重要方法,2 版本号原子类AtomicStampedReference,2.1 重要属性,2.2 重要方法,3 案例,4 总结基于JDK1.8详细介绍了JUC下面的AtomicInteger和AtomicStampedReference原子类源码和原理。 1 原子类AtomicInteger 1.1 重要属性 AtomicInteger用于实现通过原子的方式更新单个变量。AtomicInteger 中保存了一个核心字段va

  • 问题来源于BufferedInputStream为什么要将字段复制到局部变量,而不是直接使用该字段。 其中一个ansers提到了“volatile”关键字: “此外,它被声明为volatile,这意味着如果任何线程更改变量的值,此更改将立即反映在所有其他线程中。” 这似乎表明,如果一个变量没有被声明为volatile,那么“更改将立即反映在所有其他线程中”或“变量的更改将只在以后反映”的情况就不会

  • 问题内容: 和的方法有什么区别?该文档没有太多关于: 最终设置为给定值。 似乎存储的值不会立即设置为所需值,而是计划在将来的某个时间设置。但是,这种方法的实际用途是什么?有什么例子吗? 问题答案: 直接引自“ JDK-6275329:向原子类添加lazySet方法” : 作为Mustang的最后一个JSR166后续文章,我们向Atomic类(AtomicInteger,AtomicReferenc

  • 此代码在没有警告的情况下编译。标准对此是怎么说的? 声明为。因此,不应优化对此变量的读取。 但是,bar不是限定的。是否允许编译器优化对此的写入?.即。编译器将对进行读取访问,并允许丢弃该值,而不将其分配给(在L.7处)。 如果这是标准有话要说的特殊情况,可否请您加入该条款,并对标准的律师谈话进行解读?

  • 我目前正试图研究并发性,特别是“volatile”关键字。 通过声明计数器变量为volatile,所有对计数器变量的写入都将立即写回主存。此外,计数器变量的所有读取都将直接从主存中读取。下面是计数器变量的volatile声明的外观 和 当线程写入易失性变量时,不仅易失性变量本身会被写入主内存。此外,线程在写入易失性变量之前更改的所有其他变量也会刷新到主内存中。当一个线程读取一个易失性变量时,它还将