如果长变量声明为: -
private volatile long counter = 0;
现在如果我使用预增量运算符递增它,那么操作是原子的吗?
如果是,那么它会比java.util.concurrent.atomic.AtomicLong
对象的增量更有效吗?
答案 0 :(得分:17)
volatile
关键字仅解决visibility问题。您必须使用AtomicLong
或synchronized
方法/块来确定原子性(Atomicity in concurrent programming)。
今天又发表了一篇文章:Demonstrating when volatile is required
答案 1 :(得分:3)
预增量运算符不原子。此外,增加volatile long
的效率可能低于在几乎所有平台上使用AtomicLong
的效率,因为后者受硬件支持。
答案 2 :(得分:2)
简短回答是否。您需要同步递增计数器的方法,或者最好使用AtomicLong。
对于记录,++运算符即使在整数上也不是原子。
答案 3 :(得分:2)
volatile变量与原子变量不同。
对于volatile变量,java编译器会为了提高效率而尝试最小化shuffling命令(不要问我详细信息......),以避免并发问题。
为原子操作明确地创建了原子变量,就像在你的情况下以原子方式递增变量一样。