在Concurrency in Practice中,它表示你可以使用volatile变量if
写入变量不依赖于其当前值.
所以,如果你有一个共享的,可变的变量a
,并且所有的线程都是这样做的a++
(它们没有得到值,它们只是++
).
然后根据引用,volatile
即使a++
不是原子的,你应该能够做到这一点,对吗?
不,++
在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
,它实现线程安全的原子增量.