Atomic Access

在编程中,原子动作是一次有效地同时发生的动作。原子动作不能停在中间:它要么完全发生,要么根本不发生。直到动作完成,原子动作的副作用才可见。

我们已经看到,诸如c++的增量表达式没有描述原子动作。即使是非常简单的表达式也可以定义可以分解为其他动作的复杂动作。但是,您可以指定一些原子操作:

  • 对于参考变量和大多数原始变量(除了longdouble以外的所有类型),读写是原子的。

  • 对于声明为volatile的所有变量(包括longdouble变量),读写是原子的。

原子动作不能交错,因此可以使用它们而不必担心线程干扰。但是,这并不能消除所有同步原子操作的需要,因为仍然可能发生内存一致性错误。使用volatile变量可以减少内存一致性错误的风险,因为对volatile变量的任何写入都会与该变量的后续读取构建先发生后关联。这意味着对volatile变量的更改始终对其他线程可见。而且,这还意味着当线程读取volatile变量时,它不仅会看到对volatile的最新更改,而且还会看到导致更改的代码的副作用。

使用简单的原子变量访问比通过同步代码访问这些变量更有效,但是程序员需要格外小心以避免内存一致性错误。是否值得付出额外的努力取决于应用程序的大小和复杂性。

java.util.concurrent包中的某些类提供了不依赖同步的原子方法。我们将在高级并发对象上讨论它们。