Java AtomicInteger可以替换同步的吗?

Java AtomicInteger可以替换同步的吗?,java,Java,java.util.concurrent.atomic包的javadoc说明如下: 一个小的类工具箱 支持免锁线程安全 单变量编程 但我在任何AtomicInteger或AtomicBoolean类中都没有看到任何线程安全(同步或锁定)代码 那么,这两个是相同的: 1. 二, 更新:感谢您的回答。使用AtomicInteger时是否需要volatile?是的,它们在功能上是等效的 如果您处于超高争用环境中,您可能会看到性能差异,但这是极不可能的。它们将提供相同的原子性。你必须注意的唯一一件事是

java.util.concurrent.atomic包的javadoc说明如下:

一个小的类工具箱 支持免锁线程安全 单变量编程

但我在任何AtomicInteger或AtomicBoolean类中都没有看到任何线程安全(同步或锁定)代码

那么,这两个是相同的: 1.

二,


更新:感谢您的回答。使用AtomicInteger时是否需要volatile?

是的,它们在功能上是等效的


如果您处于超高争用环境中,您可能会看到性能差异,但这是极不可能的。

它们将提供相同的原子性。你必须注意的唯一一件事是,每当你读到我的时候,你也必须用synchronized来包装它

synchronized(this){ return i;}
编辑以回答您的编辑:

Volatile对于AtomicInteger不是必需的。证明声明原子整数为final。需要AtomicInteger是易失性的唯一原因是AtomicInteger字段本身发生更改。类似于:

volatile AtomicInteger i = new AtomicInteger(0);

public void work(){
    i.incrementAndGet();
    //...do some other stuff
    i = new AtomicInteger(10);//because the field i is changing the field needs to be volatile 
}

正如您可以想象的那样,情况不应该如此,因此您不必担心字段的易变性。

AtomicInteger使用sun.misc.Unsafe来执行原子更新


因此,在回答您的问题时,是的,AtomicInteger是线程安全的

它们在功能上是等价的,但有一个细微的区别
synchronized
this
上具有获取和释放监视器的开销,而
AtomicInteger
是通过本机方法调用实现的,因此速度会明显加快

使用AtomicInteger时是否需要volatile

不一定。考虑到你的例子:

  • 如果
    i
    是局部变量,或
  • 如果
    i
    final
    属性,或
  • 如果当前线程和初始化(或上次更新)
    i
    变量的线程在该事件后已同步

那么,如果您将
i
声明为volatile或非volatile也没有什么区别。

您是否有这样一个来源,即AtomicInteger的本机方法调用比使用
synchronized
要快得多?请阅读
java.util.concurrent.atomic
的Javadoc。所述目的是允许使用硬件原子原语。实现不需要这样做,但大多数现代硬件支持原子CAS,这将快得多。
synchronized(this){ return i;}
volatile AtomicInteger i = new AtomicInteger(0);

public void work(){
    i.incrementAndGet();
    //...do some other stuff
    i = new AtomicInteger(10);//because the field i is changing the field needs to be volatile 
}