AtomicInteger可以替换同步吗?

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

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

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

那么,这两个是相同的:

1。

int i; synchronized(this){i++;} 

2。

 AtomicInteger i = new AtomicInteger(); i.getAndIncrement(); 

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

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

 synchronized(this){ return i;} 

编辑以回答您的修改:

AtomicInteger不需要易失性。 要certificate声明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 } 

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

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

是的,它们在function上是等同的。

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

AtomicInteger使用下面的sun.misc.Unsafe来执行primefaces更新。

所以,回答你的问题,是的,AtomicInteger 是线程安全的

使用AtomicInteger时是否需要volatile?

不必要。 考虑你的例子:

  • 如果i是一个局部变量,或者
  • 如果ifinal属性,或者
  • 如果当前线程和初始化(或最后更新) i变量的线程在该事件之后已同步,

如果你声明i是不稳定的,那么它没有任何区别。