首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicInteger能取代synchronized吗?

AtomicInteger能取代synchronized吗?
EN

Stack Overflow用户
提问于 2010-11-18 07:32:02
回答 5查看 17.8K关注 0票数 19

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

是一个小型的类工具包,支持单变量的无锁线程安全编程。

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

那么,这两个是一样的吗:

代码语言:javascript
复制
int i;
synchronized(this){i++;}

2.

代码语言:javascript
复制
AtomicInteger i = new AtomicInteger();
i.getAndIncrement();

更新:感谢您的回答。当我使用AtomicInteger时,是否需要易失性?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-18 07:36:06

它们将提供相同的原子性。您必须知道的唯一一件事是,每当您阅读I时,您也必须用synchronized来包装它

代码语言:javascript
复制
synchronized(this){ return i;}

编辑以回答您的编辑:

对于您的AtomicInteger来说,易失性不是必需的。为了证明这一点,声明AtomicInteger最终。您需要AtomicInteger为易失性的唯一原因是如果AtomicInteger字段本身发生更改。类似于:

代码语言:javascript
复制
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 
}

正如您可以想象的那样,情况不应该是这样的,所以您不必担心字段是不稳定的。

票数 17
EN

Stack Overflow用户

发布于 2010-11-18 07:40:39

它们在功能上是相同的,但有一个细微的区别。synchronized有获取和释放this上的监视器的开销,而AtomicInteger是通过本机方法调用实现的,因此它会快得多。

票数 9
EN

Stack Overflow用户

发布于 2010-11-18 07:34:34

是的,它们在功能上是等价的。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4210292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档