Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以了解所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
在编程中,原子操作是一种实际上一次性发生的操作。原子操作不能在中间停止:它要么完全发生,要么根本不发生。原子操作的任何副作用在操作完成之前都不可见。
我们已经看到,递增表达式(如c++
)并不表示原子操作。即使非常简单的表达式也可以定义复杂的操作,可以分解为其他操作。然而,有一些你可以指定的原子操作:
long
和double
),读取和写入是原子的。volatile
的变量(包括long
和double
变量),读取和写入都是原子的。原子操作不能交错进行,因此可以无需担心线程干扰而使用它们。然而,这并不能消除所有需要同步原子操作的需求,因为仍然可能出现内存一致性错误。使用volatile
变量可以减少内存一致性错误的风险,因为对volatile
变量的任何写入都会与随后对该变量的读取建立happens-before关系。这意味着对volatile
变量的更改始终对其他线程可见。更重要的是,这还意味着当线程读取volatile
变量时,它不仅会看到对volatile
的最新更改,还会看到导致该更改的代码的副作用。
使用简单的原子变量访问比通过同步代码访问这些变量更高效,但程序员需要更加小心以避免内存一致性错误。额外的努力是否值得取决于应用程序的大小和复杂性。
在java.util.concurrent
包中的一些类提供了不依赖于同步的原子方法。我们将在高级并发对象一节中讨论它们。