长变量的原子增量?

时间:2012-02-01 20:24:01

标签: java concurrency

如果长变量声明为: -

private volatile long counter = 0;

现在如果我使用预增量运算符递增它,那么操作是原子的吗?

如果是,那么它会比java.util.concurrent.atomic.AtomicLong对象的增量更有效吗?

4 个答案:

答案 0 :(得分:17)

volatile关键字仅解决visibility问题。您必须使用AtomicLongsynchronized方法/块来确定原子性(Atomicity in concurrent programming)。

今天又发表了一篇文章:Demonstrating when volatile is required

答案 1 :(得分:3)

预增量运算符原子。此外,增加volatile long的效率可能低于在几乎所有平台上使用AtomicLong的效率,因为后者受硬件支持。

答案 2 :(得分:2)

简短回答是否。您需要同步递增计数器的方法,或者最好使用AtomicLong。

对于记录,++运算符即使在整数上也不是原子

答案 3 :(得分:2)

volatile变量与原子变量不同。

对于volatile变量,java编译器会为了提高效率而尝试最小化shuffling命令(不要问我详细信息......),以避免并发问题。

为原子操作明确地创建了原子变量,就像在你的情况下以原子方式递增变量一样。