-2

我知道为什么要在 Java 中使用同步,但我找不到这个问题的答案:

do I need to synchronized an atomic operation?

如果是,为什么?

4

3 回答 3

4

如果它真的是原子的,那么不是。

您需要同步来提供一致的状态。根据原子的定义,任何原子操作都会导致一致的状态。

于 2013-04-22T21:28:30.860 回答
3

Java 中很少有真正的原子操作。来自原子访问Java 教程:

  • long对于引用变量和大多数原始变量(除and之外的所有类型)而言,读取和写入都是原子的double
  • volatile对于声明的所有变量(包括 longdouble变量),读取和写入都是原子的。

请注意,同步不仅用于互斥,而且对于线程之间的可靠通信也是必需的。即使您正在处理原子可读和可写的数据,也无法保证一个线程何时会看到另一个线程所做的更改。出于这个原因,您需要同步对共享数据的访问,或者确保已声明共享变量volatile

于 2013-04-22T21:51:47.087 回答
2

您需要确保您的原子操作不会扩展到多个读取和更新操作。像递增和递减操作这样的简单表达式确实会扩展为多个动作,因此 i++ 和 i--不是原子操作。因此,大多数情况下,如果您从多个线程读取和更新变量,那么您最好使用同步方法。

更多详细信息: http: //docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

于 2013-04-22T21:32:45.130 回答