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. 为什么点对易失性指针(如“volatile int * p”)有用?
- 5. 联锁和易失性
- 6. 易失性和同步
- 7. 易失性结构语义
- 8. 易失性和多线程?
- 9. Java易失性数组?
- 10. Java易失性读取刷新写入和易失性写入更新读取
- 11. 易失性成员的访问方法
- 12. 同步在一起的易失性
- 13. C中的非易失性对象#
- 14. 易失性的成员函数和const
- 15. 为什么在android中lockStatic易失性?
- 16. arduino线程更新易失性变量
- 17. 优化易失性数据查询
- 18. C - 使用易失性指针
- 19. Java - 易失性不按预期工作
- 20. C易失性内存模型
- 21. 方法中是否需要“易失性”?
- 22. 线程安全无易失性
- 23. 正确使用易失性sig_atomic_t
- 24. Java对于并发性而言是易失性的
- 25. Java如何管理易失性字段的可见性?
- 26. Java中的易失性关键字 - 说明性
- 27. python psycopg2 ConnectionError:交易失败,失败是'int'对象不支持索引
- 28. 失败登录时Authlogic易失性令牌重置
- 29. 易趣交易API PHP XML呼叫失败(Ack失败)
- 30. gcc是否重新排序我的易失性变量?
您可以使用['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 –