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