在实践中的并发中,它表示如果
,您可以使用volatile变量写入变量不依赖于其当前值。
所以,如果你有一个共享的,可变的变量a
,并且所有线程都是a++
(他们没有得到值,他们只是++
) 。
然后根据引用,即使volatile
不是原子的,你应该能够使它成为a++
吗?
答案 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 ++不是原子的,它相当于
因此,如果另一个线程妨碍了,你仍然可以&#34;错过更新&#34; - volatile不是为防止这种情况而设计的,那就是&#34;同步块&#34;和#34;锁定&#34;是为了。
事实a volatile只影响其在线程之间的可见性,因为a不存储在本地缓存中,因此不同的线程(在不同的内核或处理器上运行)可以立即&#34;看到&#34;它的新价值。