在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,它实现线程安全的原子增量.