原子访问
编程中,如果一个操作在事实上是一次性完成的,那就称作原子操作。一个原子操作不可以在中间被中断:它要么一次性完成,要么根本就不会发生,在操作完成之前没有任何可见的副作用。
我们已经知道像i++这样的自增操作其实不是一个原子操作,即便是像这么简单的表达式其实是可以被分解为多步的。但是我们的确可以确认一些原子操作:
· 对引用的读和写操作,对大多数基本数据类型的读和写操作(除了long和double以外的所有类型)
· 对定义为volatile的所有字段的读和写操作都是原子的(包括long和double)
原子操作是不可交错的,所有不用怕使用它们会发生线程互相干扰(threadinterference)。但这并不意味着原子操作就不用同步了,因为内存不一致错误(memoryconsistency errors)还是有可能的。使用volatile变量可以减少发生内存不一致错误的风险,因为任何对volatile变量的写操作都会建立与后续对同一变量的读操作的“先行发生”(happens-before)关系。也意味着对volatile变量的改变总是对其他线程可见的。而且,这还意味着当一个线程去读一个volatile变量的时候,它不仅能够看到对这个volatile变量的最近的改变,还可以看到产生这个改变的代码起到的副作用(side effects)。
使用原子访问比使用同步代码高效,但是需要编程人员更加小心的去避免内存不一致错误。额外的努力是不是值得取决于应用的大小和复杂程度。
Java.util.concurrent 包中定义的一些类提供了不需要同步的原子方法,在HighLevel Concurrency Objects.一章中将会讨论。
原文出处:http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html