2016-12-07 74 views
1

Java中int类型的v​​olatile需要吗?据我了解32位平台读/写4字节类型的数据为原子。如果我将在并发程序中使用int数据类型,我可以得到问题吗?易失性的int?

+0

您可以使用['AtomicInteger'(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html) – px06

+3

'volatile'不只关于原子操作。看到这个:http://stackoverflow.com/questions/106591/do-you-ever-use-the-volatile-keyword-in-java –

回答

1

易失性不用于原子操作,但用于可视性。如果有任何更改并且应该对其他线程可见,则应使用volatile。 Here is a short description by java tutorial:

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

1

考虑下面的代码:

class Demo { 
    int value; 

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

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

即使你从不同的线程改变value一些非零值,也不能保证循环将不断完善。因为value不是原子,该环可以被优化,以(有效):如果value恰好是零时foo()首次调用发生

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

因此无限循环。

但是,如果您制作valuevolatile,则无法进行此优化。