int的易变性?

时间:2016-12-07 10:42:25

标签: java concurrency volatile

Java中的int类型是否需要volatile?据我所知32位平台读/写4bytes类型数据为原子。如果我在并发程序中使用int数据类型,我会遇到问题吗?

2 个答案:

答案 0 :(得分:1)

请考虑以下代码:

class Demo {
  int value;

  void foo() {
    while (value == 0);

    System.out.println("Done!");
  }
}

即使您将value更改为来自不同线程的某个非零值,也无法保证循环将完成。因为value不是原子的,所以循环可能被优化为(有效地):

if (value == 0)
  while (true);

因此,如果value在首次调用foo()时恰好为零,则会发生无限循环。

但如果您value volatile,则无法进行此优化。

答案 1 :(得分:1)

Volatile不用于原子操作,而是用于可见性。如果已进行任何更改并且其他线程应该可见,则应使用volatile。 Here is a short description by java tutorial:

  

原子操作不能交错,因此可以使用它们而不用担心线程干扰。但是,这并不能消除所有同步原子操作的需要,因为仍然可能存在内存一致性错误。使用volatile变量可降低内存一致性错误的风险,因为对volatile变量的任何写入都会建立与之后读取同一变量的先发生关系。这意味着对volatile变量的更改始终对其他线程可见。更重要的是,它还意味着当线程读取volatile变量时,它不仅会看到volatile的最新更改,还会看到导致更改的代码的副作用。