实践中的并发 - volatile ++

时间:2012-11-04 16:52:49

标签: java concurrency

实践中的并发中,它表示如果

,您可以使用volatile变量
  

写入变量不依赖于其当前值。

所以,如果你有一个共享的,可变的变量a,并且所有线程都是a++(他们没有得到值,他们只是++) 。

然后根据引用,即使volatile不是原子的,你应该能够使它成为a++吗?

4 个答案:

答案 0 :(得分:8)

不,在++变量上使用volatile 线程安全,因为

a++

相当于:

int temp = a;
temp = temp + 1;
a = temp;

因此,在另一个线程已经修改a之后, {> 1}可能会发生回写{em>,因为你的线程读了它,所以a,即使a++是易失性的,不是线程安全。

您可以使用AtomicInteger,它实现线程安全的原子增量。

答案 1 :(得分:6)

a ++读取a的值,因为它等同于

  • 阅读
  • 增加读取值
  • 将新值分配给

所以不,在这种情况下你不能安全地使用volatile变量。

答案 2 :(得分:3)

- Volatile执行以下操作:

  • 标记为volatile的字段将值立即写入内存退休时,其值将被读取来自记忆

  • 阻止线程中的缓存

<强>例如

a++ 可以解释为:

- 读取名为a。

的内存位置的值

- 增加价值。

- 将新增加的值写入名为a。

的内存位置

现在整个上述过程{J}中的not 线程安全,++(递增运算符)不是原子语句。

- 更好地使用synchronized关键字,或者如果您不喜欢使用它,请使用AtomicInteger类。

答案 3 :(得分:1)

a ++不是原子的,它相当于

  • 检索
  • 添加1
  • 将结果存储回

因此,如果另一个线程妨碍了,你仍然可以&#34;错过更新&#34; - volatile不是为防止这种情况而设计的,那就是&#34;同步块&#34;和#34;锁定&#34;是为了。

事实a volatile只影响其在线程之间的可见性,因为a不存储在本地缓存中,因此不同的线程(在不同的内核或处理器上运行)可以立即&#34;看到&#34;它的新价值。