当字段的值取决于其先前的值时,为什么Volatile不起作用

时间:2015-07-19 07:24:58

标签: java volatile

我发现了这句话,我想不出有什么理由。

  

当字段的值取决于它时,易失性不起作用   先前的值

高度赞赏任何有关示例的解释。

2 个答案:

答案 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

...即使它不稳定,每次迭代都是有效的:

  1. 使用我们已阅读的值
  2. 执行计算
  3. 如果一个线程执行读操作,那么另一个线程执行写操作,那么当第一个线程执行写操作时,它实际上会忽略第二个线程的写操作。

    回到我们的例子,如果你有两个线程,每个线程执行一百万次field = field + 1次迭代,field值的总增长可能不是两百万。