Java中的int类型是否需要volatile?据我所知32位平台读/写4bytes类型数据为原子。如果我在并发程序中使用int数据类型,我会遇到问题吗?
答案 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的最新更改,还会看到导致更改的代码的副作用。