# 原子访问

> 原文： [https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html](https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)

在编程中，_ 原子 _ 动作是一次有效发生的动作。原子动作不能在中间停止：它要么完全发生，要么根本不发生。在动作完成之前，原子动作的副作用是不可见的。

我们已经看到增量表达式，例如`c++`，不描述原子动作。即使非常简单的表达式也可以定义可以分解为其他操作的复杂操作。但是，您可以指定原子操作：

*   读取和写入对于引用变量和大多数原始变量（除`long`和`double`之外的所有类型）都是原子的。
*   读取和写入对于 _ 所有 _ 变量都是原子的`volatile`（_ 包括 _ `long`和`double`变量）。

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

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

[`java.util.concurrent`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html) 包中的某些类提供了不依赖于同步的原子方法。我们将在[高级并发对象](highlevel.html)一节中讨论它们。