我发现了这句话,我想不出有什么理由。
当字段的值取决于它时,易失性不起作用 先前的值
高度赞赏任何有关示例的解释。
答案 0 :(得分:5)
以下是一个例子:
volatile int i:
public void m() {
if (i == 0) i = 1;
else i = 2;
}
你可以有两个线程检查条件,看到i为0并将其设置为1,尽管可以预期这个方法的两次运行会将i设置为2.这是一个经典的" check-then -act"场景。
问题在于,波动性为您提供了可见性保证,但没有原子性保证。
答案 1 :(得分:1)
“不起作用”是一个非常模糊的说法,但我怀疑重点是,如果你有两个线程,每个线程执行一个循环使用此代码:
field = field + 1
...即使它不稳定,每次迭代都是有效的:
如果一个线程执行读操作,那么另一个线程执行写操作,那么当第一个线程执行其写操作时,它实际上会忽略第二个线程的写操作。
回到我们的例子,如果你有两个线程,每个线程执行一百万次field = field + 1
次迭代,field
值的总增长可能不是两百万。