原子访问(Atomic Access)

来源:互联网 发布:程序员创业知乎 编辑:程序博客网 时间:2024/05/05 22:49
在编程中,原子动作是一个突然有效地发生。一个原子动作在中途是不能停止的:要不完全执行完,要不一点也不执行。直到原子操作完全执行,它的副作用才会可见。

   
   我们已经看见了自增长表达式,比如c++,不描述一个原子操作。甚至非常简单的表达式可以定义复杂的动作,可以分解为其他的动作。可是,有些动作你可以指定为原子的:

      1 引用变量和大多数基本数据类型(除了long和double)的读写是原子的
      2 所有声明为volatile字段的变量读写是原子的(包括long和double)

   原子动作不能交叉,这样它们就不必担心使用时遇到线程争用了。可是,这不能完全消除同步原子动作,因为内存一致性错误仍然存在。使用volatile变量减少了这方面的风险。因为一个写volatile变量和随后的变量读建立了一个happens-before关系。这就意味着一个volatile变量的变化对其他线程是可见的。更多的,当线程读volatile变量时,它看见的不仅是volatile的最近的变化,还有导致变化的代码的副作用。


    虽然使用简单的原子变量访问比通过Synchronized代码访问更加高效,但是需要程序员更多关注避免内存一致性错误。额外的努力是否值得取决于应用程序的规模和复杂性。

    java.util.Concurrent包中一些类提供了不依赖Synchronization的原子方法。我们将在高等级并发中讨论。
0 0
原创粉丝点击