java.util.concurrent.atomic包的javadoc说明如下:
是一个小型的类工具包,支持单变量的无锁线程安全编程。
但我在任何AtomicInteger或AtomicBoolean类中都没有看到任何线程安全(同步或锁定)代码。
那么,这两个是一样的吗:
int i;
synchronized(this){i++;}2.
AtomicInteger i = new AtomicInteger();
i.getAndIncrement();更新:感谢您的回答。当我使用AtomicInteger时,是否需要易失性?
发布于 2010-11-18 07:36:06
它们将提供相同的原子性。您必须知道的唯一一件事是,每当您阅读I时,您也必须用synchronized来包装它
synchronized(this){ return i;}编辑以回答您的编辑:
对于您的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
}正如您可以想象的那样,情况不应该是这样的,所以您不必担心字段是不稳定的。
发布于 2010-11-18 07:40:39
它们在功能上是相同的,但有一个细微的区别。synchronized有获取和释放this上的监视器的开销,而AtomicInteger是通过本机方法调用实现的,因此它会快得多。
发布于 2010-11-18 07:34:34
是的,它们在功能上是等价的。
如果您处于超高争用环境中,您可能会看到性能差异,但这是非常不可能的。
https://stackoverflow.com/questions/4210292
复制相似问题