实践中的并发 - volatile ++

Sam*_*msh 6 java concurrency

Concurrency in Practice中,它表示你可以使用volatile变量if

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

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

然后根据引用,volatile即使a++不是原子的,你应该能够做到这一点,对吗?

Boh*_*ian 8

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

a++
Run Code Online (Sandbox Code Playgroud)

相当于:

int temp = a;
temp = temp + 1;
a = temp;
Run Code Online (Sandbox Code Playgroud)

所以回写a可能发生另一个线程已经修改后,a因为你的线程读取它,所以a++,即使a是volatile,也不是线程安全的.

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


JB *_*zet 6

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

  • 读一个
  • 增加读取值
  • 将新值分配给a

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