原子访问(Atomic Access)

在编程中,原子动作是一个突然有效地发生。一个原子动作在中途是不能停止的:要不完全执行完,要不一点也不执行。直到原子操作完全执行,它的副作用才会可见。


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

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

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


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

java.util.Concurrent包中一些类提供了不依赖Synchronization的原子方法。我们将在高等级并发中讨论。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值