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