2016-12-07 71 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,則無法進行此優化。