我知道为什么在Java中使用同步,但我找不到这个问题的答案:
do I need to synchronized an atomic operation?
如果是,为什么?
答案 0 :(得分:4)
如果它真的是原子的,那么没有。
您需要同步才能提供连贯状态。根据原子的定义,任何原子操作都会产生cohernt状态。
答案 1 :(得分:3)
Java中真正的原子操作很少。来自Atomic Access Java教程:
long
和double
之外的所有类型),读取和写入都是原子的。volatile
的所有变量(包括 long
和double
变量),读取和写入都是原子的。请注意,同步不仅用于互斥,而且还需要线程之间的可靠通信。即使您正在处理原子可读和可写的数据,也无法保证一个线程何时会看到另一个线程所做的更改。因此,您需要同步访问共享数据,或确保声明共享变量volatile
。
答案 2 :(得分:2)
您需要确保原子操作不会扩展到多个读取和更新操作。像递增和递减操作这样的简单表达式会扩展为多个动作,因此i ++和i--是不原子操作。因此,大多数情况下,如果您正在从多个线程读取和更新变量,那么最好使用同步方法。
更多详情: http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html