Java中int類型的volatile需要嗎?據我瞭解32位平臺讀/寫4字節類型的數據爲原子。如果我將在併發程序中使用int數據類型,我可以得到問題嗎?易失性的int?
Q
易失性的int?
1
A
回答
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);
因此無限循環。
但是,如果您製作value
volatile
,則無法進行此優化。
相關問題
- 1. 易失性函數
- 2. 易失性超載?
- 3. 易失性寫入非易失性寫入重新排序
- 4. 爲易失性和非易失性實例重載類
- 5. 爲什麼點對易失性指針(如「volatile int * p」)有用?
- 6. Java易失性數組?
- 7. 易失性關鍵字 - MSP430
- 8. 非易失性變量
- 9. 易失性和多線程?
- 10. 聯鎖和易失性
- 11. 易失性和同步
- 12. 易失性結構語義
- 13. Java易失性讀取刷新寫入和易失性寫入更新讀取
- 14. 易失性讀取是否發生在易失性寫入之前?
- 15. 同步在一起的易失性
- 16. C中的非易失性對象#
- 17. Ember的易失性和模板
- 18. 易失性的成員函數和const
- 19. console.log的非易失性替代品
- 20. 易失性成員的訪問方法
- 21. 查詢Teradata中的易失性表格
- 22. 我怎樣才能讓一個易失性結構在分配過程中的行爲完全像一個易失性int?
- 23. Java - 易失性不按預期工作
- 24. 線程安全無易失性
- 25. 方法中是否需要「易失性」?
- 26. scipy curve_fit容易線性擬合失敗?
- 27. 非易失性printf式記錄器
- 28. 優化易失性數據查詢
- 29. GCC原子builtin和易失性
- 30. Java在原始數據上易失性
您可以使用['AtomicInteger'(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html) – px06
'volatile'不只關於原子操作。看到這個:http://stackoverflow.com/questions/106591/do-you-ever-use-the-volatile-keyword-in-java –