AtomicInteger可以替换同步吗?

rob*_*bin 19 java

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

一个小型工具包,支持对单个变量进行无锁线程安全编程.

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

那么,这两个是相同的:

1.

int i;
synchronized(this){i++;}
Run Code Online (Sandbox Code Playgroud)

2.

AtomicInteger i = new AtomicInteger();
i.getAndIncrement();
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*int 17

他们会提供相同的原子性.你必须要注意的唯一事情是你读的时候你必须用同步包装它

synchronized(this){ return i;}
Run Code Online (Sandbox Code Playgroud)

编辑以回答您的修改:

AtomicInteger不需要易失性.要证明声明AtomicInteger最终.您需要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 
}
Run Code Online (Sandbox Code Playgroud)

你可以想象不应该这样,所以你不必担心这个领域是不稳定的.


Jim*_*son 9

它们在功能上是等价的,但有一个微妙的区别.synchronized具有获取和释放监视器的开销this,同时AtomicInteger使用本机方法调用实现,因此它将显着更快.

  • 阅读Javadoc中的`java.util.concurrent.atomic`.所述目的是允许使用硬件原子基元.实现不需要这样做,但大多数现代硬件支持原子CAS,这将更快. (5认同)